@@ -20,7 +20,7 @@ pub(super) struct MapsEntry {
2020 /// x = execute
2121 /// s = shared
2222 /// p = private (copy on write)
23- perms : [ char ; 4 ] ,
23+ perms : [ u8 ; 4 ] ,
2424 /// Offset into the file (or "whatever").
2525 offset : u64 ,
2626 /// device (major, minor)
@@ -132,14 +132,12 @@ impl FromStr for MapsEntry {
132132 } else {
133133 return Err ( "Couldn't parse address range" ) ;
134134 } ;
135- let perms: [ char ; 4 ] = {
136- let mut chars = perms_str. chars ( ) ;
137- let mut c = || chars. next ( ) . ok_or ( "insufficient perms" ) ;
138- let perms = [ c ( ) ?, c ( ) ?, c ( ) ?, c ( ) ?] ;
139- if chars. next ( ) . is_some ( ) {
140- return Err ( "too many perms" ) ;
141- }
142- perms
135+ let perms = if let & [ r, w, x, p, ..] = perms_str. as_bytes ( ) {
136+ // If a system in the future adds a 5th field to the permission list,
137+ // there's no reason to assume previous fields were invalidated.
138+ [ r, w, x, p]
139+ } else {
140+ return Err ( "less than 4 perms" ) ;
143141 } ;
144142 let offset = hex64 ( offset_str) ?;
145143 let dev = if let Some ( ( major, minor) ) = dev_str. split_once ( ':' ) {
@@ -172,7 +170,7 @@ fn check_maps_entry_parsing_64bit() {
172170 . unwrap( ) ,
173171 MapsEntry {
174172 address: ( 0xffffffffff600000 , 0xffffffffff601000 ) ,
175- perms: [ '-' , '-' , 'x' , 'p' ] ,
173+ perms: * b"--xp" ,
176174 offset: 0x00000000 ,
177175 dev: ( 0x00 , 0x00 ) ,
178176 inode: 0x0 ,
@@ -187,7 +185,7 @@ fn check_maps_entry_parsing_64bit() {
187185 . unwrap( ) ,
188186 MapsEntry {
189187 address: ( 0x7f5985f46000 , 0x7f5985f48000 ) ,
190- perms: [ 'r' , 'w' , '-' , 'p' ] ,
188+ perms: * b"rw-p" ,
191189 offset: 0x00039000 ,
192190 dev: ( 0x103 , 0x06 ) ,
193191 inode: 0x76021795 ,
@@ -200,7 +198,7 @@ fn check_maps_entry_parsing_64bit() {
200198 . unwrap( ) ,
201199 MapsEntry {
202200 address: ( 0x35b1a21000 , 0x35b1a22000 ) ,
203- perms: [ 'r' , 'w' , '-' , 'p' ] ,
201+ perms: * b"rw-p" ,
204202 offset: 0x00000000 ,
205203 dev: ( 0x00 , 0x00 ) ,
206204 inode: 0x0 ,
@@ -224,7 +222,7 @@ fn check_maps_entry_parsing_32bit() {
224222 . unwrap( ) ,
225223 MapsEntry {
226224 address: ( 0x08056000 , 0x08077000 ) ,
227- perms: [ 'r' , 'w' , '-' , 'p' ] ,
225+ perms: * b"rw-p" ,
228226 offset: 0x00000000 ,
229227 dev: ( 0x00 , 0x00 ) ,
230228 inode: 0x0 ,
@@ -239,7 +237,7 @@ fn check_maps_entry_parsing_32bit() {
239237 . unwrap( ) ,
240238 MapsEntry {
241239 address: ( 0xb7c79000 , 0xb7e02000 ) ,
242- perms: [ 'r' , '-' , '-' , 'p' ] ,
240+ perms: * b"r--p" ,
243241 offset: 0x00000000 ,
244242 dev: ( 0x08 , 0x01 ) ,
245243 inode: 0x60662705 ,
@@ -252,7 +250,7 @@ fn check_maps_entry_parsing_32bit() {
252250 . unwrap( ) ,
253251 MapsEntry {
254252 address: ( 0xb7e02000 , 0xb7e03000 ) ,
255- perms: [ 'r' , 'w' , '-' , 'p' ] ,
253+ perms: * b"rw-p" ,
256254 offset: 0x00000000 ,
257255 dev: ( 0x00 , 0x00 ) ,
258256 inode: 0x0 ,
0 commit comments