diff --git a/jc/parsers/proc_pid_smaps.py b/jc/parsers/proc_pid_smaps.py index d7be98fc..bedd6a08 100644 --- a/jc/parsers/proc_pid_smaps.py +++ b/jc/parsers/proc_pid_smaps.py @@ -168,7 +168,7 @@ import jc.utils class info(): """Provides parser metadata (version, author, etc.)""" - version = '1.0' + version = '1.1' description = '`/proc//smaps` file parser' author = 'Kelly Brazil' author_email = 'kellyjonbrazil@gmail.com' @@ -205,33 +205,46 @@ def _process(proc_data: List[Dict]) -> List[Dict]: vmflags_map = { 'rd': 'readable', - 'wr': 'writeable', - 'ex': 'executable', - 'sh': 'shared', - 'mr': 'may read', - 'mw': 'may write', - 'me': 'may execute', - 'ms': 'may share', - 'mp': 'MPX-specific VMA', - 'gd': 'stack segment growns down', - 'pf': 'pure PFN range', - 'dw': 'disabled write to the mapped file', - 'lo': 'pages are locked in memory', - 'io': 'memory mapped I/O area', - 'sr': 'sequential read advise provided', - 'rr': 'random read advise provided', - 'dc': 'do not copy area on fork', - 'de': 'do not expand area on remapping', - 'ac': 'area is accountable', - 'nr': 'swap space is not reserved for the area', - 'ht': 'area uses huge tlb pages', - 'ar': 'architecture specific flag', - 'dd': 'do not include area into core dump', - 'sd': 'soft-dirty flag', - 'mm': 'mixed map area', - 'hg': 'huge page advise flag', - 'nh': 'no-huge page advise flag', - 'mg': 'mergable advise flag' + 'wr': 'writeable', + 'ex': 'executable', + 'sh': 'shared', + 'mr': 'may read', + 'mw': 'may write', + 'me': 'may execute', + 'ms': 'may share', + 'mp': 'MPX-specific VMA', + 'gd': 'stack segment growns down', + 'pf': 'pure PFN range', + 'dw': 'disabled write to the mapped file', + 'lo': 'pages are locked in memory', + 'io': 'memory mapped I/O area', + 'sr': 'sequential read advise provided', + 'rr': 'random read advise provided', + 'dc': 'do not copy area on fork', + 'de': 'do not expand area on remapping', + 'ac': 'area is accountable', + 'nr': 'swap space is not reserved for the area', + 'ht': 'area uses huge tlb pages', + 'sf': 'perform synchronous page faults', + 'nl': 'non-linear mapping', + 'ar': 'architecture specific flag', + 'wf': 'wipe on fork', + 'dd': 'do not include area into core dump', + 'sd': 'soft-dirty flag', + 'mm': 'mixed map area', + 'hg': 'huge page advise flag', + 'nh': 'no-huge page advise flag', + 'mg': 'mergable advise flag', + 'bt': 'arm64 BTI guarded page', + 'mt': 'arm64 MTE allocation tags are enabled', + 'um': 'userfaultfd missing pages tracking', + 'uw': 'userfaultfd wprotect pages tracking', + 'ui': 'userfaultfd minor fault', + 'ss': 'shadow/guarded control stack page', + 'sl': 'sealed', + 'lf': 'lock on fault pages', + 'dp': 'always lazily freeable mapping', + 'gu': 'maybe contains guard regions' } for entry in proc_data: @@ -245,7 +258,7 @@ def _process(proc_data: List[Dict]) -> List[Dict]: if 'VmFlags' in entry: entry['VmFlags'] = entry['VmFlags'].split() - entry['VmFlags_pretty'] = [vmflags_map[x] for x in entry['VmFlags']] + entry['VmFlags_pretty'] = [vmflags_map.get(x, x) for x in entry['VmFlags']] return proc_data diff --git a/tests/fixtures/linux-proc/pid_smaps_unknown_flag b/tests/fixtures/linux-proc/pid_smaps_unknown_flag new file mode 100644 index 00000000..403b5be1 --- /dev/null +++ b/tests/fixtures/linux-proc/pid_smaps_unknown_flag @@ -0,0 +1,46 @@ +55a9e753c000-55a9e7570000 r--p 00000000 fd:00 798126 /usr/lib/systemd/systemd +Size: 208 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Rss: 208 kB +Pss: 104 kB +Shared_Clean: 208 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 0 kB +Referenced: 208 kB +Anonymous: 0 kB +LazyFree: 0 kB +AnonHugePages: 0 kB +ShmemPmdMapped: 0 kB +FilePmdMapped: 0 kB +Shared_Hugetlb: 0 kB +Private_Hugetlb: 0 kB +Swap: 0 kB +SwapPss: 0 kB +Locked: 0 kB +THPeligible: 0 +VmFlags: rd mr mw me dw sd zz +55a9e7570000-55a9e763a000 r-xp 00034000 fd:00 798126 /usr/lib/systemd/systemd +Size: 808 kB +KernelPageSize: 4 kB +MMUPageSize: 4 kB +Rss: 800 kB +Pss: 378 kB +Shared_Clean: 800 kB +Shared_Dirty: 0 kB +Private_Clean: 0 kB +Private_Dirty: 0 kB +Referenced: 800 kB +Anonymous: 0 kB +LazyFree: 0 kB +AnonHugePages: 0 kB +ShmemPmdMapped: 0 kB +FilePmdMapped: 0 kB +Shared_Hugetlb: 0 kB +Private_Hugetlb: 0 kB +Swap: 0 kB +SwapPss: 0 kB +Locked: 0 kB +THPeligible: 0 +VmFlags: rd ex mr mw me dw sd yy diff --git a/tests/fixtures/linux-proc/pid_smaps_unknown_flag.json b/tests/fixtures/linux-proc/pid_smaps_unknown_flag.json new file mode 100644 index 00000000..2fad71ae --- /dev/null +++ b/tests/fixtures/linux-proc/pid_smaps_unknown_flag.json @@ -0,0 +1 @@ +[{"start":"55a9e753c000","end":"55a9e7570000","perms":["read","private"],"offset":"00000000","maj":"fd","min":"00","inode":798126,"pathname":"/usr/lib/systemd/systemd","Size":208,"KernelPageSize":4,"MMUPageSize":4,"Rss":208,"Pss":104,"Shared_Clean":208,"Shared_Dirty":0,"Private_Clean":0,"Private_Dirty":0,"Referenced":208,"Anonymous":0,"LazyFree":0,"AnonHugePages":0,"ShmemPmdMapped":0,"FilePmdMapped":0,"Shared_Hugetlb":0,"Private_Hugetlb":0,"Swap":0,"SwapPss":0,"Locked":0,"THPeligible":0,"VmFlags":["rd","mr","mw","me","dw","sd","zz"],"VmFlags_pretty":["readable","may read","may write","may execute","disabled write to the mapped file","soft-dirty flag","zz"]},{"start":"55a9e7570000","end":"55a9e763a000","perms":["read","execute","private"],"offset":"00034000","maj":"fd","min":"00","inode":798126,"pathname":"/usr/lib/systemd/systemd","Size":808,"KernelPageSize":4,"MMUPageSize":4,"Rss":800,"Pss":378,"Shared_Clean":800,"Shared_Dirty":0,"Private_Clean":0,"Private_Dirty":0,"Referenced":800,"Anonymous":0,"LazyFree":0,"AnonHugePages":0,"ShmemPmdMapped":0,"FilePmdMapped":0,"Shared_Hugetlb":0,"Private_Hugetlb":0,"Swap":0,"SwapPss":0,"Locked":0,"THPeligible":0,"VmFlags":["rd","ex","mr","mw","me","dw","sd","yy"],"VmFlags_pretty":["readable","executable","may read","may write","may execute","disabled write to the mapped file","soft-dirty flag","yy"]}] diff --git a/tests/test_proc_pid_smaps.py b/tests/test_proc_pid_smaps.py index b579c801..290af663 100644 --- a/tests/test_proc_pid_smaps.py +++ b/tests/test_proc_pid_smaps.py @@ -16,7 +16,10 @@ class MyTests(unittest.TestCase): fixtures = { 'proc_pid_smaps': ( 'fixtures/linux-proc/pid_smaps', - 'fixtures/linux-proc/pid_smaps.json') + 'fixtures/linux-proc/pid_smaps.json'), + 'proc_pid_smaps_unknown_flag': ( + 'fixtures/linux-proc/pid_smaps_unknown_flag', + 'fixtures/linux-proc/pid_smaps_unknown_flag.json') } for file, filepaths in fixtures.items(): @@ -39,6 +42,13 @@ class MyTests(unittest.TestCase): self.assertEqual(jc.parsers.proc_pid_smaps.parse(self.f_in['proc_pid_smaps'], quiet=True), self.f_json['proc_pid_smaps']) + def test_proc_pid_smaps_unknown_flag(self): + """ + Test '/proc//smaps' with an unknown flag + """ + self.assertEqual(jc.parsers.proc_pid_smaps.parse(self.f_in['proc_pid_smaps_unknown_flag'], quiet=True), + self.f_json['proc_pid_smaps_unknown_flag']) + if __name__ == '__main__': unittest.main()