Skip to content

Commit 8f1ba15

Browse files
committed
Fix memory leak in GzipReader.readall
1 parent 7fffa65 commit 8f1ba15

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

benchmark_scripts/memory_leak_test.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import sys
2+
from isal import igzip
3+
import resource
4+
import gc
5+
6+
for _ in range(10):
7+
with igzip.open(sys.argv[1], "rb") as reader:
8+
a = reader.read()
9+
print(len(a))
10+
gc.collect()
11+
memory_usage = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
12+
memory_usage_mb = memory_usage / 1024
13+
print(f"Maximum memory usage: {memory_usage_mb:.2f} MiB")
14+
del(a)
15+
objects_and_size = [(sys.getsizeof(obj), type(obj)) for obj in
16+
gc.get_objects()]
17+
objects_and_size.sort(key=lambda x: x[0], reverse=True)
18+
print(objects_and_size[:10])

src/isal/isal_zlibmodule.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1995,14 +1995,16 @@ GzipReader_readall(GzipReader *self, PyObject *Py_UNUSED(ignore))
19951995
return NULL;
19961996
}
19971997
if (written_size == 0) {
1998+
Py_DECREF(chunk);
19981999
break;
19992000
}
20002001
if (_PyBytes_Resize(&chunk, written_size) < 0) {
20012002
Py_DECREF(chunk_list);
20022003
return NULL;
20032004
}
2004-
if (PyList_Append(chunk_list, chunk) < 0) {
2005-
Py_DECREF(chunk);
2005+
int ret = PyList_Append(chunk_list, chunk);
2006+
Py_DECREF(chunk);
2007+
if (ret < 0) {
20062008
Py_DECREF(chunk_list);
20072009
return NULL;
20082010
}
@@ -2014,6 +2016,7 @@ GzipReader_readall(GzipReader *self, PyObject *Py_UNUSED(ignore))
20142016
}
20152017
PyObject *ret = _PyBytes_Join(empty_bytes, chunk_list);
20162018
Py_DECREF(empty_bytes);
2019+
Py_DECREF(chunk_list);
20172020
return ret;
20182021
}
20192022

0 commit comments

Comments
 (0)