summaryrefslogtreecommitdiff
path: root/python/binaryview.py
diff options
context:
space:
mode:
authorRyan Snyder <ryan@vector35.com>2018-09-26 07:11:37 -0400
committerRyan Snyder <ryan@vector35.com>2018-09-26 11:21:29 -0400
commitbd0215667a465dc23b4d0949fd8457d7e6411fd7 (patch)
tree881fe9a1d294d64b8b2487ad60c64514490b7e44 /python/binaryview.py
parent474af687134930f8c1e8f13c6cfe5fd5574cf8c3 (diff)
python3: ensure callbacks live long enough
Diffstat (limited to 'python/binaryview.py')
-rw-r--r--python/binaryview.py14
1 files changed, 13 insertions, 1 deletions
diff --git a/python/binaryview.py b/python/binaryview.py
index efffe3e3..9fea3fa7 100644
--- a/python/binaryview.py
+++ b/python/binaryview.py
@@ -604,8 +604,10 @@ class BinaryView(object):
registered_view_type = None
next_address = 0
_associated_data = {}
+ _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:
@@ -625,6 +627,7 @@ 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.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)
@@ -647,6 +650,8 @@ 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
@@ -792,7 +797,8 @@ class BinaryView(object):
def __del__(self):
for i in self.notifications.values():
i._unregister()
- core.BNFreeBinaryView(self.handle)
+ if self._must_free:
+ core.BNFreeBinaryView(self.handle)
def __iter__(self):
count = ctypes.c_ulonglong(0)
@@ -1190,6 +1196,12 @@ class BinaryView(object):
log.log_error(traceback.format_exc())
return False
+ def _free_object(self, ctxt):
+ try:
+ self.__class__._registered_instances.remove(self)
+ except:
+ log.log_error(traceback.format_exc())
+
def _read(self, ctxt, dest, offset, length):
try:
data = self.perform_read(offset, length)