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.
This commit is contained in:
Gregory P. Smith 2012-11-27 10:19:29 -08:00
parent eff174b8b0
commit 0d68ab3f48
2 changed files with 9 additions and 3 deletions

View file

@ -96,7 +96,7 @@ static int floatsleep(double);
static double floattime(void);
/* For Y2K check */
static PyObject *moddict;
static PyObject *moddict = NULL;
/* Exposed in timefuncs.h. */
time_t
@ -858,6 +858,11 @@ inittime(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);
@ -1050,5 +1055,3 @@ floatsleep(double secs)
return 0;
}