summaryrefslogtreecommitdiff
path: root/python/binaryview.py
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2019-05-10 16:15:48 -0400
committerRusty Wagner <rusty@vector35.com>2019-05-10 16:15:48 -0400
commitf6659517c08799cf52fddd09424eaea867ff3ed7 (patch)
treeab06cf065b7c152dff91658c7247946cb7ffaec8 /python/binaryview.py
parent63a4020845a81cf8793ddb02c7d5c95e3317d2a1 (diff)
Fix memory leak and use after free bugs in BinaryView and FlowGraph objects
Diffstat (limited to 'python/binaryview.py')
-rw-r--r--python/binaryview.py17
1 files changed, 10 insertions, 7 deletions
diff --git a/python/binaryview.py b/python/binaryview.py
index 1baeab2b..66c30d06 100644
--- a/python/binaryview.py
+++ b/python/binaryview.py
@@ -735,7 +735,6 @@ class BinaryView(object):
_registered_instances = []
def __init__(self, file_metadata=None, parent_view=None, handle=None):
- self._must_free = True
if handle is not None:
self.handle = core.handle_of_type(handle, core.BNBinaryView)
if file_metadata is None:
@@ -755,7 +754,8 @@ class BinaryView(object):
self._cb = core.BNCustomBinaryView()
self._cb.context = 0
self._cb.init = self._cb.init.__class__(self._init)
- self._cb.freeObject = self._cb.freeObject.__class__(self._free_object)
+ self._cb.externalRefTaken = self._cb.externalRefTaken.__class__(self._external_ref_taken)
+ self._cb.externalRefReleased = self._cb.externalRefReleased.__class__(self._external_ref_released)
self._cb.read = self._cb.read.__class__(self._read)
self._cb.write = self._cb.write.__class__(self._write)
self._cb.insert = self._cb.insert.__class__(self._insert)
@@ -778,8 +778,6 @@ class BinaryView(object):
if parent_view is not None:
parent_view = parent_view.handle
self.handle = core.BNCreateCustomBinaryView(self.__class__.name, file_metadata.handle, parent_view, self._cb)
- self.__class__._registered_instances.append(self)
- self._must_free = False
self.notifications = {}
self.next_address = None # Do NOT try to access view before init() is called, use placeholder
@@ -925,8 +923,7 @@ class BinaryView(object):
def __del__(self):
for i in self.notifications.values():
i._unregister()
- if self._must_free:
- core.BNFreeBinaryView(self.handle)
+ core.BNFreeBinaryView(self.handle)
def __iter__(self):
count = ctypes.c_ulonglong(0)
@@ -1388,7 +1385,13 @@ class BinaryView(object):
log.log_error(traceback.format_exc())
return False
- def _free_object(self, ctxt):
+ def _external_ref_taken(self, ctxt):
+ try:
+ self.__class__._registered_instances.append(self)
+ except:
+ log.log_error(traceback.format_exc())
+
+ def _external_ref_released(self, ctxt):
try:
self.__class__._registered_instances.remove(self)
except: