@@ -67,9 +67,11 @@ impl Region {
67
67
let mut offset: Option < u64 > = None ;
68
68
let mut dev: Option < String > = None ;
69
69
let mut inode: Option < u64 > = None ;
70
- let mut pathname: Option < String > = None ;
70
+ let pathname: Option < String > = None ;
71
+ let mut pathname_tokens = vec ! [ ] ;
71
72
72
73
let mut chars = metadata_line. char_indices ( ) . peekable ( ) ;
74
+ let mut entered_pathname = false ;
73
75
74
76
loop {
75
77
let token = next_token ( metadata_line, & mut chars) ;
@@ -93,14 +95,15 @@ impl Region {
93
95
dev = Some ( token. to_string ( ) ) ;
94
96
} else if inode. is_none ( ) {
95
97
inode = Some ( token. parse :: < u64 > ( ) ?) ;
96
- } else if pathname. is_none ( ) {
97
- pathname = Some ( token. to_string ( ) ) ;
98
+ } else if pathname. is_none ( ) || entered_pathname {
99
+ entered_pathname = true ;
100
+ pathname_tokens. push ( token) ;
98
101
} else {
99
102
break ;
100
103
}
101
104
}
102
105
103
- pathname
106
+ pathname_tokens . join ( " " )
104
107
} ;
105
108
106
109
let mut size: Option < u64 > = None ;
@@ -216,7 +219,7 @@ impl Region {
216
219
} ;
217
220
218
221
Ok ( Region {
219
- pathname : pathname . unwrap_or_default ( ) ,
222
+ pathname,
220
223
size,
221
224
pss,
222
225
swap,
@@ -731,4 +734,38 @@ VmFlags: rd ex mr mw me de sd";
731
734
732
735
let _region = Region :: from_str ( region) . expect ( "Parsing failed" ) ;
733
736
}
737
+
738
+ #[ test]
739
+ fn test_pathnames_with_whitespace ( ) {
740
+ let region =
741
+ "7514356d1000-7514356d3000 rw-p 00000000 00:00 0 [anon: glibc: loader malloc]
742
+ Size: 8 kB
743
+ KernelPageSize: 4 kB
744
+ MMUPageSize: 4 kB
745
+ Rss: 8 kB
746
+ Pss: 8 kB
747
+ Pss_Dirty: 8 kB
748
+ Shared_Clean: 0 kB
749
+ Shared_Dirty: 0 kB
750
+ Private_Clean: 0 kB
751
+ Private_Dirty: 8 kB
752
+ Referenced: 8 kB
753
+ Anonymous: 8 kB
754
+ KSM: 0 kB
755
+ LazyFree: 0 kB
756
+ AnonHugePages: 0 kB
757
+ ShmemPmdMapped: 0 kB
758
+ FilePmdMapped: 0 kB
759
+ Shared_Hugetlb: 0 kB
760
+ Private_Hugetlb: 0 kB
761
+ Swap: 0 kB
762
+ SwapPss: 0 kB
763
+ Locked: 0 kB
764
+ THPeligible: 0
765
+ ProtectionKey: 0
766
+ VmFlags: rd wr mr mw me ac sd" ;
767
+ let parsed_region = Region :: from_str ( region) . expect ( "Parsing failed" ) ;
768
+
769
+ assert_eq ! ( parsed_region. pathname, ( "[anon: glibc: loader malloc]" ) ) ;
770
+ }
734
771
}
0 commit comments