Commit 9d4ee12c authored by Victor Stinner's avatar Victor Stinner

Issue #12124: zipimport doesn't keep a reference to zlib.decompress() anymore

to be able to unload the module.
parent 19794d6e
...@@ -19,11 +19,6 @@ import io ...@@ -19,11 +19,6 @@ import io
from traceback import extract_tb, extract_stack, print_tb from traceback import extract_tb, extract_stack, print_tb
raise_src = 'def do_raise(): raise TypeError\n' raise_src = 'def do_raise(): raise TypeError\n'
# so we only run testAFakeZlib once if this test is run repeatedly
# which happens when we look for ref leaks
test_imported = False
def make_pyc(co, mtime): def make_pyc(co, mtime):
data = marshal.dumps(co) data = marshal.dumps(co)
if type(mtime) is type(0.0): if type(mtime) is type(0.0):
...@@ -453,19 +448,7 @@ class BadFileZipImportTestCase(unittest.TestCase): ...@@ -453,19 +448,7 @@ class BadFileZipImportTestCase(unittest.TestCase):
zipimport._zip_directory_cache.clear() zipimport._zip_directory_cache.clear()
def cleanup():
# this is necessary if test is run repeated (like when finding leaks)
global test_imported
if test_imported:
zipimport._zip_directory_cache.clear()
if hasattr(UncompressedZipImportTestCase, 'testAFakeZlib'):
delattr(UncompressedZipImportTestCase, 'testAFakeZlib')
if hasattr(CompressedZipImportTestCase, 'testAFakeZlib'):
delattr(CompressedZipImportTestCase, 'testAFakeZlib')
test_imported = True
def test_main(): def test_main():
cleanup()
try: try:
support.run_unittest( support.run_unittest(
UncompressedZipImportTestCase, UncompressedZipImportTestCase,
......
...@@ -72,6 +72,9 @@ Core and Builtins ...@@ -72,6 +72,9 @@ Core and Builtins
Library Library
------- -------
- Issue #12124: zipimport doesn't keep a reference to zlib.decompress() anymore
to be able to unload the module.
- Issue #10801: In zipfile, support different encodings for the header and - Issue #10801: In zipfile, support different encodings for the header and
the filenames. the filenames.
......
...@@ -785,35 +785,33 @@ error: ...@@ -785,35 +785,33 @@ error:
/* Return the zlib.decompress function object, or NULL if zlib couldn't /* Return the zlib.decompress function object, or NULL if zlib couldn't
be imported. The function is cached when found, so subsequent calls be imported. The function is cached when found, so subsequent calls
don't import zlib again. Returns a *borrowed* reference. don't import zlib again. */
XXX This makes zlib.decompress immortal. */
static PyObject * static PyObject *
get_decompress_func(void) get_decompress_func(void)
{ {
static PyObject *decompress = NULL; static int importing_zlib = 0;
PyObject *zlib;
PyObject *decompress;
if (decompress == NULL) { if (importing_zlib != 0)
PyObject *zlib; /* Someone has a zlib.py[co] in their Zip file;
static int importing_zlib = 0; let's avoid a stack overflow. */
return NULL;
if (importing_zlib != 0) importing_zlib = 1;
/* Someone has a zlib.py[co] in their Zip file; zlib = PyImport_ImportModuleNoBlock("zlib");
let's avoid a stack overflow. */ importing_zlib = 0;
return NULL; if (zlib != NULL) {
importing_zlib = 1; decompress = PyObject_GetAttrString(zlib,
zlib = PyImport_ImportModuleNoBlock("zlib"); "decompress");
importing_zlib = 0; Py_DECREF(zlib);
if (zlib != NULL) { }
decompress = PyObject_GetAttrString(zlib, else {
"decompress"); PyErr_Clear();
Py_DECREF(zlib); decompress = NULL;
}
else
PyErr_Clear();
if (Py_VerboseFlag)
PySys_WriteStderr("# zipimport: zlib %s\n",
zlib != NULL ? "available": "UNAVAILABLE");
} }
if (Py_VerboseFlag)
PySys_WriteStderr("# zipimport: zlib %s\n",
zlib != NULL ? "available": "UNAVAILABLE");
return decompress; return decompress;
} }
...@@ -904,6 +902,7 @@ get_data(char *archive, PyObject *toc_entry) ...@@ -904,6 +902,7 @@ get_data(char *archive, PyObject *toc_entry)
goto error; goto error;
} }
data = PyObject_CallFunction(decompress, "Oi", raw_data, -15); data = PyObject_CallFunction(decompress, "Oi", raw_data, -15);
Py_DECREF(decompress);
error: error:
Py_DECREF(raw_data); Py_DECREF(raw_data);
return data; return data;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment