mirror of https://github.com/python/cpython
Issue #12124: zipimport doesn't keep a reference to zlib.decompress() anymore
to be able to unload the module.
This commit is contained in:
parent
ae8856fe36
commit
4925cde1cc
|
@ -19,11 +19,6 @@ import io
|
|||
from traceback import extract_tb, extract_stack, print_tb
|
||||
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):
|
||||
data = marshal.dumps(co)
|
||||
if type(mtime) is type(0.0):
|
||||
|
@ -453,19 +448,7 @@ class BadFileZipImportTestCase(unittest.TestCase):
|
|||
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():
|
||||
cleanup()
|
||||
try:
|
||||
support.run_unittest(
|
||||
UncompressedZipImportTestCase,
|
||||
|
|
|
@ -72,6 +72,9 @@ Core and Builtins
|
|||
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
|
||||
the filenames.
|
||||
|
||||
|
|
|
@ -785,35 +785,33 @@ error:
|
|||
|
||||
/* Return the zlib.decompress function object, or NULL if zlib couldn't
|
||||
be imported. The function is cached when found, so subsequent calls
|
||||
don't import zlib again. Returns a *borrowed* reference.
|
||||
XXX This makes zlib.decompress immortal. */
|
||||
don't import zlib again. */
|
||||
static PyObject *
|
||||
get_decompress_func(void)
|
||||
{
|
||||
static PyObject *decompress = NULL;
|
||||
static int importing_zlib = 0;
|
||||
PyObject *zlib;
|
||||
PyObject *decompress;
|
||||
|
||||
if (decompress == NULL) {
|
||||
PyObject *zlib;
|
||||
static int importing_zlib = 0;
|
||||
|
||||
if (importing_zlib != 0)
|
||||
/* Someone has a zlib.py[co] in their Zip file;
|
||||
let's avoid a stack overflow. */
|
||||
return NULL;
|
||||
importing_zlib = 1;
|
||||
zlib = PyImport_ImportModuleNoBlock("zlib");
|
||||
importing_zlib = 0;
|
||||
if (zlib != NULL) {
|
||||
decompress = PyObject_GetAttrString(zlib,
|
||||
"decompress");
|
||||
Py_DECREF(zlib);
|
||||
}
|
||||
else
|
||||
PyErr_Clear();
|
||||
if (Py_VerboseFlag)
|
||||
PySys_WriteStderr("# zipimport: zlib %s\n",
|
||||
zlib != NULL ? "available": "UNAVAILABLE");
|
||||
if (importing_zlib != 0)
|
||||
/* Someone has a zlib.py[co] in their Zip file;
|
||||
let's avoid a stack overflow. */
|
||||
return NULL;
|
||||
importing_zlib = 1;
|
||||
zlib = PyImport_ImportModuleNoBlock("zlib");
|
||||
importing_zlib = 0;
|
||||
if (zlib != NULL) {
|
||||
decompress = PyObject_GetAttrString(zlib,
|
||||
"decompress");
|
||||
Py_DECREF(zlib);
|
||||
}
|
||||
else {
|
||||
PyErr_Clear();
|
||||
decompress = NULL;
|
||||
}
|
||||
if (Py_VerboseFlag)
|
||||
PySys_WriteStderr("# zipimport: zlib %s\n",
|
||||
zlib != NULL ? "available": "UNAVAILABLE");
|
||||
return decompress;
|
||||
}
|
||||
|
||||
|
@ -904,6 +902,7 @@ get_data(char *archive, PyObject *toc_entry)
|
|||
goto error;
|
||||
}
|
||||
data = PyObject_CallFunction(decompress, "Oi", raw_data, -15);
|
||||
Py_DECREF(decompress);
|
||||
error:
|
||||
Py_DECREF(raw_data);
|
||||
return data;
|
||||
|
|
Loading…
Reference in New Issue