diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2011-05-19 22:18:58 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2011-05-19 22:18:58 (GMT) |
commit | 4445ec81c17c672b5d245da7a1af0e0294debcc0 (patch) | |
tree | 76b535a06bee9683634b32452dc4f4faca400907 /Modules/zipimport.c | |
parent | f23f786c6172da874202b134ab1dedd99e0a261a (diff) | |
parent | 4925cde1cc20fe559b9c1429a99bf9b1c17f7048 (diff) | |
download | cpython-4445ec81c17c672b5d245da7a1af0e0294debcc0.zip cpython-4445ec81c17c672b5d245da7a1af0e0294debcc0.tar.gz cpython-4445ec81c17c672b5d245da7a1af0e0294debcc0.tar.bz2 |
(Merge 3.1) Issue #12124: zipimport doesn't keep a reference to
zlib.decompress() anymore to be able to unload the module.
Diffstat (limited to 'Modules/zipimport.c')
-rw-r--r-- | Modules/zipimport.c | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/Modules/zipimport.c b/Modules/zipimport.c index 88a27c1..68c2894 100644 --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -856,35 +856,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; } @@ -975,6 +973,7 @@ get_data(PyObject *archive, PyObject *toc_entry) goto error; } data = PyObject_CallFunction(decompress, "Oi", raw_data, -15); + Py_DECREF(decompress); error: Py_DECREF(raw_data); return data; |