From 64880d2493cc00fe2f52fa65419bdadc53ff2d19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D0=BC=D1=91=D0=BD=20=D0=9C=D0=B0=D1=80=D1=8C?= =?UTF-8?q?=D1=8F=D1=81=D0=B8=D0=BD?= Date: Sat, 16 Feb 2019 20:29:53 +0300 Subject: [PATCH] Fix skipdata struct being destroyed (#1385) --- bindings/python/capstone/__init__.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/bindings/python/capstone/__init__.py b/bindings/python/capstone/__init__.py index 203a8071..d6fe4649 100644 --- a/bindings/python/capstone/__init__.py +++ b/bindings/python/capstone/__init__.py @@ -834,6 +834,9 @@ class Cs(object): # default mnemonic for SKIPDATA self._skipdata_mnem = ".byte" self._skipdata_cb = (None, None) + # store reference to option object to avoid it being freed + # because C code uses it by reference + self._skipdata_opt = _cs_opt_skipdata() self._skipdata = False @@ -908,12 +911,11 @@ class Cs(object): @skipdata_setup.setter def skipdata_setup(self, opt): - _skipdata_opt = _cs_opt_skipdata() _mnem, _cb, _ud = opt - _skipdata_opt.mnemonic = _mnem.encode() - _skipdata_opt.callback = CS_SKIPDATA_CALLBACK(_cb or 0) - _skipdata_opt.user_data = ctypes.cast(_ud, ctypes.c_void_p) - status = _cs.cs_option(self.csh, CS_OPT_SKIPDATA_SETUP, ctypes.cast(ctypes.byref(_skipdata_opt), ctypes.c_void_p)) + self._skipdata_opt.mnemonic = _mnem.encode() + self._skipdata_opt.callback = CS_SKIPDATA_CALLBACK(_cb or 0) + self._skipdata_opt.user_data = ctypes.cast(_ud, ctypes.c_void_p) + status = _cs.cs_option(self.csh, CS_OPT_SKIPDATA_SETUP, ctypes.cast(ctypes.byref(self._skipdata_opt), ctypes.c_void_p)) if status != CS_ERR_OK: raise CsError(status)