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

@ -507,6 +507,9 @@ Library
Extension Modules 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 #12268: File readline, readlines and read or readall methods - Issue #12268: File readline, readlines and read or readall methods
no longer lose data when an underlying read system call is interrupted no longer lose data when an underlying read system call is interrupted
within an io module object. IOError is no longer raised due to a read within an io module object. IOError is no longer raised due to a read

View File

@ -96,7 +96,7 @@ static int floatsleep(double);
static double floattime(void); static double floattime(void);
/* For Y2K check */ /* For Y2K check */
static PyObject *moddict; static PyObject *moddict = NULL;
/* Exposed in timefuncs.h. */ /* Exposed in timefuncs.h. */
time_t time_t
@ -858,6 +858,11 @@ inittime(void)
/* Accept 2-digit dates unless PYTHONY2K is set and non-empty */ /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */
p = Py_GETENV("PYTHONY2K"); p = Py_GETENV("PYTHONY2K");
PyModule_AddIntConstant(m, "accept2dyear", (long) (!p || !*p)); 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 */ /* Squirrel away the module's dictionary for the y2k check */
moddict = PyModule_GetDict(m); moddict = PyModule_GetDict(m);
Py_INCREF(moddict); Py_INCREF(moddict);
@ -1050,5 +1055,3 @@ floatsleep(double secs)
return 0; return 0;
} }