Browse Source
bpo-36854: Fix refleak in subinterpreter (GH-17331)
finalize_interp_clear() now explicitly clears the codec registry and
then trigger a GC collection to clear all references.
pull/17330/head
Victor Stinner
6 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
13 additions and
2 deletions
-
Modules/_testcapimodule.c
-
Python/pylifecycle.c
|
|
|
@ -6721,11 +6721,14 @@ PyInit__testcapi(void) |
|
|
|
PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type); |
|
|
|
|
|
|
|
PyModule_AddIntConstant(m, "the_number_three", 3); |
|
|
|
PyObject *v; |
|
|
|
#ifdef WITH_PYMALLOC |
|
|
|
PyModule_AddObject(m, "WITH_PYMALLOC", Py_True); |
|
|
|
v = Py_True; |
|
|
|
#else |
|
|
|
PyModule_AddObject(m, "WITH_PYMALLOC", Py_False); |
|
|
|
v = Py_False; |
|
|
|
#endif |
|
|
|
Py_INCREF(v); |
|
|
|
PyModule_AddObject(m, "WITH_PYMALLOC", v); |
|
|
|
|
|
|
|
TestError = PyErr_NewException("_testcapi.error", NULL, NULL); |
|
|
|
Py_INCREF(TestError); |
|
|
|
|
|
|
|
@ -1210,6 +1210,14 @@ finalize_interp_clear(PyThreadState *tstate) |
|
|
|
{ |
|
|
|
int is_main_interp = _Py_IsMainInterpreter(tstate); |
|
|
|
|
|
|
|
/* bpo-36854: Explicitly clear the codec registry |
|
|
|
and trigger a GC collection */ |
|
|
|
PyInterpreterState *interp = tstate->interp; |
|
|
|
Py_CLEAR(interp->codec_search_path); |
|
|
|
Py_CLEAR(interp->codec_search_cache); |
|
|
|
Py_CLEAR(interp->codec_error_registry); |
|
|
|
_PyGC_CollectNoFail(); |
|
|
|
|
|
|
|
/* Clear interpreter state and all thread states */ |
|
|
|
PyInterpreterState_Clear(tstate->interp); |
|
|
|
|
|
|
|
|