diff options
author | Gregory P. Smith <greg@krypto.org> | 2012-11-27 18:16:55 (GMT) |
---|---|---|
committer | Gregory P. Smith <greg@krypto.org> | 2012-11-27 18:16:55 (GMT) |
commit | 14b04cd350acad54e5bc87745c8c55823e2fbecf (patch) | |
tree | a58376023d568c9aa04b5d587fd4dd05747983ed | |
parent | 28c88f48f9dd6943a20758e733806cbaf735e139 (diff) | |
download | cpython-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/NEWS | 3 | ||||
-rw-r--r-- | Modules/timemodule.c | 7 |
2 files changed, 9 insertions, 1 deletions
@@ -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); |