浏览代码

Only create mmap once per binary

We keep the context manager in play just to avoid refactoring all
of the references to that.
nosoop 10 月之前
父节点
当前提交
243c23f315
共有 1 个文件被更改,包括 4 次插入10 次删除
  1. 4 10
      src/smgdc/validate.py

+ 4 - 10
src/smgdc/validate.py

@@ -52,6 +52,7 @@ class BaseBinary:
     path: pathlib.Path
     angr: angr.Project
     _file: io.IOBase
+    _mm: mmap.mmap
 
     def __init__(self, path: pathlib.Path, cache_path: pathlib.Path | None = None):
         self.path = path
@@ -64,22 +65,15 @@ class BaseBinary:
             cached_proj.write_bytes(pickle.dumps(self.angr))
         else:
             self.angr = pickle.loads(cached_proj.read_bytes())
+        self._mm = mmap.mmap(self._file.fileno(), 0, access=mmap.ACCESS_READ)
 
     @contextlib.contextmanager
     def mmap(self):
-        mm = mmap.mmap(self._file.fileno(), 0, access=mmap.ACCESS_READ)
-        yield mm
-
-        # FIXME: We currently don't close this because an error gets thrown at
-        #        ``LocationEntry.calculate_phys_address()`` due to exported pointers.  It's not
-        #        clear to me if the issue stems from ``ByteSignature.expr.finditer()`` or
-        #        something else at this point.
-        # mm.close()
+        yield self._mm
 
     def read(self, address, size) -> bytes:
         # shorthand to read a value from a physical file
-        with self.mmap() as memory:
-            return memory[address : address + size]
+        return self._mm[address : address + size]
 
 
 class WindowsBinary(BaseBinary):