diff options
author | Skip Montanaro <skip@pobox.com> | 2008-09-23 00:52:29 +0000 |
---|---|---|
committer | Skip Montanaro <skip@pobox.com> | 2008-09-23 00:52:29 +0000 |
commit | 680dcd0de65897ab4a7d08497cd47719115703ed (patch) | |
tree | 775a6a00424cd398e0993b0a1f3f219b26b53e30 /Modules/atexitmodule.c | |
parent | d53d8db8d41b63aa66f5622ec6b023d65aea8cef (diff) | |
download | cpython-680dcd0de65897ab4a7d08497cd47719115703ed.tar.gz |
Fix for issue 3666 - atexit.register with bad inputs segfaults on exit.
Reviewed by Christian Heimes.
Diffstat (limited to 'Modules/atexitmodule.c')
-rw-r--r-- | Modules/atexitmodule.c | 13 |
1 files changed, 7 insertions, 6 deletions
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; } |