diff --git a/Misc/NEWS b/Misc/NEWS index 8c137558440..abe5f5162fa 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -507,6 +507,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 #12268: File readline, readlines and read or readall methods 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 diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 397cf8cd6f9..13be691979f 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -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; } - -