@@ -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