From 50c3823f500491cc39dff9dbf664dc2573b13f45 Mon Sep 17 00:00:00 2001 From: Josh Date: Fri, 16 Jan 2015 07:39:07 -0500 Subject: [PATCH] - Fixed memory leak for cython disasm functions --- bindings/python/pyx/ccapstone.pyx | 32 ++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/bindings/python/pyx/ccapstone.pyx b/bindings/python/pyx/ccapstone.pyx index 7b097482..e60f8039 100644 --- a/bindings/python/pyx/ccapstone.pyx +++ b/bindings/python/pyx/ccapstone.pyx @@ -273,17 +273,18 @@ cdef class Cs(object): detail = self._cs.detail arch = self._cs.arch - for i from 0 <= i < res: - if detail: - dummy = CsInsn(CsDetail(arch, allinsn[i].detail)) - else: - dummy = CsInsn(None) + try: + for i from 0 <= i < res: + if detail: + dummy = CsInsn(CsDetail(arch, allinsn[i].detail)) + else: + dummy = CsInsn(None) - dummy._raw = allinsn[i] - dummy._csh = self.csh - yield dummy - - cc.cs_free(allinsn, res) + dummy._raw = allinsn[i] + dummy._csh = self.csh + yield dummy + finally: + cc.cs_free(allinsn, res) # Light function to disassemble binary. This is about 20% faster than disasm() because @@ -299,11 +300,12 @@ cdef class Cs(object): cdef res = cc.cs_disasm(self.csh, code, len(code), addr, count, &allinsn) - for i from 0 <= i < res: - insn = allinsn[i] - yield (insn.address, insn.size, insn.mnemonic, insn.op_str) - - cc.cs_free(allinsn, res) + try: + for i from 0 <= i < res: + insn = allinsn[i] + yield (insn.address, insn.size, insn.mnemonic, insn.op_str) + finally: + cc.cs_free(allinsn, res) # print out debugging info