diff --git a/volatility/framework/layers/resources.py b/volatility/framework/layers/resources.py index 5d01bc3dd..01e3c1096 100644 --- a/volatility/framework/layers/resources.py +++ b/volatility/framework/layers/resources.py @@ -37,6 +37,22 @@ vollog = logging.getLogger(__name__) # fix this +def cascadeCloseFile(new_fp, original_fp): + """Really horrible solution for ensuring files aren't left open + + Args: + new_fp: The file pointer constructed based on the original file pointer + original_fp: The original file pointer that should be closed when the new file pointer is closed, but isn't + """ + + def close(): + original_fp.close() + return new_fp.__class__.close(new_fp) + + new_fp.close = close + return new_fp + + class ResourceAccessor(object): """Object for openning URLs as files (downloading locally first if necessary)""" @@ -140,12 +156,11 @@ class ResourceAccessor(object): if detected: if detected.mime_type == 'application/x-xz': - curfile = lzma.LZMAFile(curfile, mode) + curfile = cascadeCloseFile(lzma.LZMAFile(curfile, mode), curfile) elif detected.mime_type == 'application/x-bzip2': - curfile = bz2.BZ2File(curfile, mode) + curfile = cascadeCloseFile(bz2.BZ2File(curfile, mode), curfile) elif detected.mime_type == 'application/x-gzip': - curfile = gzip.GzipFile(fileobj = curfile, mode = mode) - + curfile = cascadeCloseFile(gzip.GzipFile(fileobj = curfile, mode = mode), curfile) if detected.mime_type in ['application/x-xz', 'application/x-bzip2', 'application/x-gzip']: # Read and rewind to ensure we're inside any compressed file layers curfile.read(1) @@ -164,11 +179,11 @@ class ResourceAccessor(object): url_path, extension = url_path_split[:-1], url_path_split[-1] url_path = ".".join(url_path) if extension == "xz": - curfile = lzma.LZMAFile(curfile, mode) + curfile = cascadeCloseFile(lzma.LZMAFile(curfile, mode), curfile) elif extension == "bz2": - curfile = bz2.BZ2File(curfile, mode) + curfile = cascadeCloseFile(bz2.BZ2File(curfile, mode), curfile) elif extension == "gz": - curfile = gzip.GzipFile(fileobj = curfile, mode = mode) + curfile = cascadeCloseFile(gzip.GzipFile(fileobj = curfile, mode = mode), curfile) else: stop = True