Skip to content

Commit

Permalink
Fix ResourceWarning by keeping track and closing open files
Browse files Browse the repository at this point in the history
  • Loading branch information
ekilmer committed Oct 18, 2019
1 parent a605cba commit 53389f5
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 0 deletions.
4 changes: 4 additions & 0 deletions manticore/binary/binary.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
14 changes: 14 additions & 0 deletions manticore/platforms/linux.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(":"):
Expand All @@ -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
Expand Down Expand Up @@ -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:
Expand Down

0 comments on commit 53389f5

Please sign in to comment.