From 53389f5d3537eb15fed3f757962c1fd8a4b74466 Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Fri, 18 Oct 2019 17:34:52 -0400 Subject: [PATCH] Fix ResourceWarning by keeping track and closing open files --- manticore/binary/binary.py | 4 ++++ manticore/platforms/linux.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/manticore/binary/binary.py b/manticore/binary/binary.py index c8a7fffc0..fed97c7c0 100644 --- a/manticore/binary/binary.py +++ b/manticore/binary/binary.py @@ -105,6 +105,10 @@ def __init__(self, filename): assert self.interpreter.arch == self.arch assert self.interpreter.elf.header.e_type in ["ET_DYN", "ET_EXEC"] + def __del__(self): + if self.elf is not None: + self.elf.stream.close() + def maps(self): for elf_segment in self.elf.iter_segments(): if elf_segment.header.p_type != "PT_LOAD" or elf_segment.header.p_memsz == 0: diff --git a/manticore/platforms/linux.py b/manticore/platforms/linux.py index 1301f9ca3..428112809 100644 --- a/manticore/platforms/linux.py +++ b/manticore/platforms/linux.py @@ -950,12 +950,22 @@ def load(self, filename, env): # Get interpreter elf interpreter = None + + # Need to clean up when we are done + def _clean_interp_stream(): + if interpreter is not None: + try: + interpreter.stream.close() + except IOError as e: + logger.error(str(e)) + for elf_segment in elf.iter_segments(): if elf_segment.header.p_type != "PT_INTERP": continue interpreter_filename = elf_segment.data()[:-1] logger.info(f"Interpreter filename: {interpreter_filename}") if os.path.exists(interpreter_filename.decode("utf-8")): + _clean_interp_stream() interpreter = ELFFile(open(interpreter_filename, "rb")) elif "LD_LIBRARY_PATH" in env: for mpath in env["LD_LIBRARY_PATH"].split(":"): @@ -964,6 +974,7 @@ def load(self, filename, env): ) logger.info(f"looking for interpreter {interpreter_path_filename}") if os.path.exists(interpreter_path_filename): + _clean_interp_stream() interpreter = ELFFile(open(interpreter_path_filename, "rb")) break break @@ -1173,6 +1184,9 @@ def load(self, filename, env): "AT_EXECFN": at_execfn, # Filename of executable. } + # Clean up interpreter ELFFile + _clean_interp_stream() + def _to_signed_dword(self, dword): arch_width = self.current.address_bit_size if arch_width == 32: