From: Skip Montanaro Date: Tue, 23 Sep 2008 00:52:29 +0000 (+0000) Subject: Fix for issue 3666 - atexit.register with bad inputs segfaults on exit. X-Git-Tag: v3.0rc2~156 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=711552bb40f7a9f74139963a9822b49d853aee31;p=python Fix for issue 3666 - atexit.register with bad inputs segfaults on exit. Reviewed by Christian Heimes. --- diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index 5b073cbc01..be16de4a17 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -10,6 +10,8 @@ /* Forward declaration (for atexit_cleanup) */ static PyObject *atexit_clear(PyObject*); +/* Forward declaration (for atexit_callfuncs) */ +static void atexit_cleanup(void); /* ===================================================================== */ /* Callback machinery. */ @@ -26,7 +28,7 @@ static int callback_len = 32; /* Installed into pythonrun.c's atexit mechanism */ -void +static void atexit_callfuncs(void) { PyObject *exc_type = NULL, *exc_value, *exc_tb, *r; @@ -60,11 +62,13 @@ atexit_callfuncs(void) } } + atexit_cleanup(); + if (exc_type) PyErr_Restore(exc_type, exc_value, exc_tb); } -void +static void atexit_delete_cb(int i) { atexit_callback *cb = atexit_callbacks[i]; @@ -75,7 +79,7 @@ atexit_delete_cb(int i) PyMem_Free(cb); } -void +static void atexit_cleanup(void) { PyObject *r = atexit_clear(NULL); @@ -260,8 +264,5 @@ PyInit_atexit(void) return NULL; _Py_PyAtExit(atexit_callfuncs); - /* Register a callback that will free - atexit_callbacks, otherwise valgrind will report memory leaks. */ - Py_AtExit(atexit_cleanup); return m; }