@@ -96,54 +96,36 @@ impl FromStr for MapsEntry {
96
96
// Note that paths may contain spaces, so we can't use `str::split` for parsing (until
97
97
// Split::remainder is stabilized #77998).
98
98
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.
129
110
111
+ let hex = |s| usize:: from_str_radix ( s, 16 ) . map_err ( |_| parse_err) ;
130
112
let address = if let Some ( ( start, limit) ) = range_str. split_once ( '-' ) {
131
113
( hex ( start) ?, hex ( limit) ?)
132
114
} else {
133
- return Err ( "Couldn't parse address range" ) ;
115
+ return Err ( parse_err ) ;
134
116
} ;
135
117
let _perms = if let & [ r, w, x, p, ..] = perms_str. as_bytes ( ) {
136
118
// If a system in the future adds a 5th field to the permission list,
137
119
// there's no reason to assume previous fields were invalidated.
138
120
[ r, w, x, p]
139
121
} else {
140
- return Err ( "less than 4 perms" ) ;
122
+ return Err ( parse_err ) ;
141
123
} ;
142
124
let _offset = hex ( offset_str) ?;
143
125
let _dev = if let Some ( ( major, minor) ) = dev_str. split_once ( ':' ) {
144
126
( hex ( major) ?, hex ( minor) ?)
145
127
} else {
146
- return Err ( "Couldn't parse dev" ) ;
128
+ return Err ( parse_err ) ;
147
129
} ;
148
130
let _inode = hex ( inode_str) ?;
149
131
let pathname = pathname_str. into ( ) ;
0 commit comments