mirror of
https://github.com/volatilityfoundation/volatility3.git
synced 2026-09-13 13:17:38 +02:00
Resources: Ensure we close all file pointers
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user