summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGregory P. Smith <greg@krypto.org>2012-11-27 18:16:55 (GMT)
committerGregory P. Smith <greg@krypto.org>2012-11-27 18:16:55 (GMT)
commit14b04cd350acad54e5bc87745c8c55823e2fbecf (patch)
treea58376023d568c9aa04b5d587fd4dd05747983ed
parent28c88f48f9dd6943a20758e733806cbaf735e139 (diff)
downloadcpython-14b04cd350acad54e5bc87745c8c55823e2fbecf.zip
cpython-14b04cd350acad54e5bc87745c8c55823e2fbecf.tar.gz
cpython-14b04cd350acad54e5bc87745c8c55823e2fbecf.tar.bz2
Plug a leak in timemodule. The module dictionary is saved during
initialization. If the interpreter is shut down and reinitialized (embedded CPython), the old module dictionary was not dec-refed during the next import of the time extension module. Contributed by Torsten Marek of Google.
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/timemodule.c7
2 files changed, 9 insertions, 1 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index b04986b..0b6e917 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -620,6 +620,9 @@ Library
Extension Modules
-----------------
+- Fix the leak of a dict in the time module when used in an embedded
+ interpreter that is repeatedly initialized and shutdown and reinitialized.
+
- Issue #16012: Fix a regression in pyexpat. The parser's UseForeignDTD()
method doesn't require an argument again.
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 626db3e..35162ff 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -63,7 +63,7 @@ static int floatsleep(double);
static double floattime(void);
/* For Y2K check */
-static PyObject *moddict;
+static PyObject *moddict = NULL;
static PyObject *
time_time(PyObject *self, PyObject *unused)
@@ -941,6 +941,11 @@ PyInit_time(void)
/* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
p = Py_GETENV("PYTHONY2K");
PyModule_AddIntConstant(m, "accept2dyear", (long) (!p || !*p));
+ /* If an embedded interpreter is shutdown and reinitialized the old
+ moddict was not decrefed on shutdown and the next import of this
+ module leads to a leak. Conditionally decref here to prevent that.
+ */
+ Py_XDECREF(moddict);
/* Squirrel away the module's dictionary for the y2k check */
moddict = PyModule_GetDict(m);
Py_INCREF(moddict);