@@ -18,7 +18,7 @@ pub(super) struct MapsEntry {
1818     /// x = execute 
1919     /// s = shared 
2020     /// p = private (copy on write) 
21-      perms :  [ char ;  4 ] , 
21+      perms :  [ u8 ;  4 ] , 
2222    /// Offset into the file (or "whatever"). 
2323     offset :  usize , 
2424    /// device (major, minor) 
@@ -102,14 +102,12 @@ impl FromStr for MapsEntry {
102102        }  else  { 
103103            return  Err ( "Couldn't parse address range" ) ; 
104104        } ; 
105-         let  perms:  [ char ;  4 ]  = { 
106-             let  mut  chars = perms_str. chars ( ) ; 
107-             let  mut  c = || chars. next ( ) . ok_or ( "insufficient perms" ) ; 
108-             let  perms = [ c ( ) ?,  c ( ) ?,  c ( ) ?,  c ( ) ?] ; 
109-             if  chars. next ( ) . is_some ( )  { 
110-                 return  Err ( "too many perms" ) ; 
111-             } 
112-             perms
105+         let  perms = if  let  & [ r,  w,  x,  p,  ..]  = perms_str. as_bytes ( )  { 
106+             // If a system in the future adds a 5th field to the permission list, 
107+             // there's no reason to assume previous fields were invalidated. 
108+             [ r,  w,  x,  p] 
109+         }  else  { 
110+             return  Err ( "less than 4 perms" ) ; 
113111        } ; 
114112        let  offset = hex ( offset_str) ?; 
115113        let  dev = if  let  Some ( ( major,  minor) )  = dev_str. split_once ( ':' )  { 
@@ -142,7 +140,7 @@ fn check_maps_entry_parsing_64bit() {
142140            . unwrap( ) , 
143141        MapsEntry  { 
144142            address:  ( 0xffffffffff600000 ,  0xffffffffff601000 ) , 
145-             perms:  [ '-' ,   '-' ,   'x' ,   'p' ] , 
143+             perms:  * b"--xp" , 
146144            offset:  0x00000000 , 
147145            dev:  ( 0x00 ,  0x00 ) , 
148146            inode:  0x0 , 
@@ -157,7 +155,7 @@ fn check_maps_entry_parsing_64bit() {
157155            . unwrap( ) , 
158156        MapsEntry  { 
159157            address:  ( 0x7f5985f46000 ,  0x7f5985f48000 ) , 
160-             perms:  [ 'r' ,   'w' ,   '-' ,   'p' ] , 
158+             perms:  * b"rw-p" , 
161159            offset:  0x00039000 , 
162160            dev:  ( 0x103 ,  0x06 ) , 
163161            inode:  0x76021795 , 
@@ -170,7 +168,7 @@ fn check_maps_entry_parsing_64bit() {
170168            . unwrap( ) , 
171169        MapsEntry  { 
172170            address:  ( 0x35b1a21000 ,  0x35b1a22000 ) , 
173-             perms:  [ 'r' ,   'w' ,   '-' ,   'p' ] , 
171+             perms:  * b"rw-p" , 
174172            offset:  0x00000000 , 
175173            dev:  ( 0x00 ,  0x00 ) , 
176174            inode:  0x0 , 
@@ -194,7 +192,7 @@ fn check_maps_entry_parsing_32bit() {
194192            . unwrap( ) , 
195193        MapsEntry  { 
196194            address:  ( 0x08056000 ,  0x08077000 ) , 
197-             perms:  [ 'r' ,   'w' ,   '-' ,   'p' ] , 
195+             perms:  * b"rw-p" , 
198196            offset:  0x00000000 , 
199197            dev:  ( 0x00 ,  0x00 ) , 
200198            inode:  0x0 , 
@@ -209,7 +207,7 @@ fn check_maps_entry_parsing_32bit() {
209207            . unwrap( ) , 
210208        MapsEntry  { 
211209            address:  ( 0xb7c79000 ,  0xb7e02000 ) , 
212-             perms:  [ 'r' ,   '-' ,   '-' ,   'p' ] , 
210+             perms:  * b"r--p" , 
213211            offset:  0x00000000 , 
214212            dev:  ( 0x08 ,  0x01 ) , 
215213            inode:  0x60662705 , 
@@ -222,7 +220,7 @@ fn check_maps_entry_parsing_32bit() {
222220            . unwrap( ) , 
223221        MapsEntry  { 
224222            address:  ( 0xb7e02000 ,  0xb7e03000 ) , 
225-             perms:  [ 'r' ,   'w' ,   '-' ,   'p' ] , 
223+             perms:  * b"rw-p" , 
226224            offset:  0x00000000 , 
227225            dev:  ( 0x00 ,  0x00 ) , 
228226            inode:  0x0 , 
0 commit comments