From 13e7da4d4dbd036767b8c611ff41d9097e3e8010 Mon Sep 17 00:00:00 2001 From: Kyle Sunden Date: Fri, 2 Jun 2023 23:11:41 -0500 Subject: [PATCH] Backport PR #25858: Get dlerror() immediately after dlclose() fails. --- src/_tkagg.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/_tkagg.cpp b/src/_tkagg.cpp index 663c06fd0474..b280ac5e1fb3 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);