From 286eeda8c11fcc0645ef4b6f809267b1f55c1309 Mon Sep 17 00:00:00 2001 From: Antony Lee Date: Thu, 11 May 2023 10:09:46 +0200 Subject: [PATCH] Get dlerror() immediately after dlclose() fails. Otherwise the second dlclose() could clear the exception set by the first one. --- src/_tkagg.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/_tkagg.cpp b/src/_tkagg.cpp index 3b50ab0e8581..5c36b3f07f50 100644 --- a/src/_tkagg.cpp +++ b/src/_tkagg.cpp @@ -324,11 +324,16 @@ void load_tkinter_funcs(void) exit: // We don't need to keep a reference open as the main program & tkinter - // have been imported. Use a non-short-circuiting "or" to try closing both - // handles before handling errors. - if ((main_program && dlclose(main_program)) - | (tkinter_lib && dlclose(tkinter_lib))) { + // have been imported. Try to close each library separately (otherwise the + // second dlclose could clear a dlerror from the first dlclose). + bool raised_dlerror = false; + if (main_program && dlclose(main_program) && !raised_dlerror) { PyErr_SetString(PyExc_RuntimeError, dlerror()); + raised_dlerror = true; + } + if (tkinter_lib && dlclose(tkinter_lib) && !raised_dlerror) { + PyErr_SetString(PyExc_RuntimeError, dlerror()); + raised_dlerror = true; } Py_XDECREF(module); Py_XDECREF(py_path);