Skip to content

Commit fddf229

Browse files
Omit needless error strings
1 parent 515006b commit fddf229

File tree

1 file changed

+15
-33
lines changed

1 file changed

+15
-33
lines changed

src/symbolize/gimli/parse_running_mmaps_unix.rs

Lines changed: 15 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -96,54 +96,36 @@ impl FromStr for MapsEntry {
9696
// Note that paths may contain spaces, so we can't use `str::split` for parsing (until
9797
// Split::remainder is stabilized #77998).
9898
fn from_str(s: &str) -> Result<Self, Self::Err> {
99-
let (range_str, s) = s.trim_start().split_once(' ').unwrap_or((s, ""));
100-
if range_str.is_empty() {
101-
return Err("Couldn't find address");
102-
}
103-
104-
let (perms_str, s) = s.trim_start().split_once(' ').unwrap_or((s, ""));
105-
if perms_str.is_empty() {
106-
return Err("Couldn't find permissions");
107-
}
108-
109-
let (offset_str, s) = s.trim_start().split_once(' ').unwrap_or((s, ""));
110-
if offset_str.is_empty() {
111-
return Err("Couldn't find offset");
112-
}
113-
114-
let (dev_str, s) = s.trim_start().split_once(' ').unwrap_or((s, ""));
115-
if dev_str.is_empty() {
116-
return Err("Couldn't find dev");
117-
}
118-
119-
let (inode_str, s) = s.trim_start().split_once(' ').unwrap_or((s, ""));
120-
if inode_str.is_empty() {
121-
return Err("Couldn't find inode");
122-
}
123-
124-
// Pathname may be omitted in which case it will be empty
125-
let pathname_str = s.trim_start();
126-
127-
let hex = |s| usize::from_str_radix(s, 16).map_err(|_| "Couldn't parse hex number");
128-
let hex64 = |s| u64::from_str_radix(s, 16).map_err(|_| "Couldn't parse hex number");
99+
let missing_field = "failed to find all map fields";
100+
let parse_err = "failed to parse all map fields";
101+
let mut parts = s
102+
.split(' ') // space-separated fields
103+
.filter(|s| s.len() > 0); // multiple spaces implies empty strings that need to be skipped.
104+
let range_str = parts.next().ok_or(missing_field)?;
105+
let perms_str = parts.next().ok_or(missing_field)?;
106+
let offset_str = parts.next().ok_or(missing_field)?;
107+
let dev_str = parts.next().ok_or(missing_field)?;
108+
let inode_str = parts.next().ok_or(missing_field)?;
109+
let pathname_str = parts.next().unwrap_or(""); // pathname may be omitted.
129110

111+
let hex = |s| usize::from_str_radix(s, 16).map_err(|_| parse_err);
130112
let address = if let Some((start, limit)) = range_str.split_once('-') {
131113
(hex(start)?, hex(limit)?)
132114
} else {
133-
return Err("Couldn't parse address range");
115+
return Err(parse_err);
134116
};
135117
let _perms = if let &[r, w, x, p, ..] = perms_str.as_bytes() {
136118
// If a system in the future adds a 5th field to the permission list,
137119
// there's no reason to assume previous fields were invalidated.
138120
[r, w, x, p]
139121
} else {
140-
return Err("less than 4 perms");
122+
return Err(parse_err);
141123
};
142124
let _offset = hex(offset_str)?;
143125
let _dev = if let Some((major, minor)) = dev_str.split_once(':') {
144126
(hex(major)?, hex(minor)?)
145127
} else {
146-
return Err("Couldn't parse dev");
128+
return Err(parse_err);
147129
};
148130
let _inode = hex(inode_str)?;
149131
let pathname = pathname_str.into();

0 commit comments

Comments
 (0)