From e29a86b4857c960139c898d4250d58e3d03ed1de Mon Sep 17 00:00:00 2001 From: atlas0fd00m Date: Mon, 19 Aug 2024 14:36:00 -0400 Subject: [PATCH] fix bug in readMemString(<>, wide=True) where the last \x00 is considered part of the terminator instead of the last character (#663) with unittests --- envi/memory.py | 4 ++++ envi/tests/test_memory.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/envi/memory.py b/envi/memory.py index 20e4e5d11..fbfdf080d 100755 --- a/envi/memory.py +++ b/envi/memory.py @@ -739,6 +739,10 @@ def readMemString(self, va, maxlen=0xfffffff, wide=False): # now find the end of the string based on either \x00, maxlen, or end of map end = mbytes.find(terminator, offset) + while (end > offset) and (end-offset) % len(terminator) != 0: + # with codepage 0, we really need \0\0\0 because the first + # 0 is part of the last character + end = mbytes.find(terminator, end+1) left = end - offset if end == -1: diff --git a/envi/tests/test_memory.py b/envi/tests/test_memory.py index 7fa9d55f4..515d8b6bf 100755 --- a/envi/tests/test_memory.py +++ b/envi/tests/test_memory.py @@ -64,4 +64,18 @@ def test_allocator(self): with self.assertRaises(e_exc.NoValidFreeMemoryFound): failmap = mem.allocateMemory(0x100000) + def test_readMemString(self): + mem = e_mem.MemoryObject() + mem.addMemoryMap(0x41410000, e_const.MM_RWX, 'test', b'\0'*1024) + mem.addMemoryMap(0x41420000, e_const.MM_RWX, 'test', b'abcdefghijklmnop\0' + b'\0'*1024) + mem.addMemoryMap(0x41430000, e_const.MM_RWX, 'test', b'a\0b\0c\0d\0e\0f\0g\0h\0i\0j\0k\0l\0m\0n\0o\0p\0' + b'\0'*1024) + + self.assertEqual(mem.readMemString(0x41410000), b'') + self.assertEqual(mem.readMemString(0x41420000), b'abcdefghijklmnop') + self.assertEqual(mem.readMemString(0x41430000), b'a') + + self.assertEqual(mem.readMemString(0x41410000, wide=True), b'',) + self.assertEqual(mem.readMemString(0x41420000, wide=True), b'abcdefghijklmnop') # only looks for '\0\0' terminator + self.assertEqual(mem.readMemString(0x41430000, wide=True), b'a\0b\0c\0d\0e\0f\0g\0h\0i\0j\0k\0l\0m\0n\0o\0p\0') +