aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/shiboken6/libshiboken/signature/signature.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/sources/shiboken6/libshiboken/signature/signature.cpp b/sources/shiboken6/libshiboken/signature/signature.cpp
index 81f464cd3..a783d16f2 100644
--- a/sources/shiboken6/libshiboken/signature/signature.cpp
+++ b/sources/shiboken6/libshiboken/signature/signature.cpp
@@ -303,11 +303,18 @@ static PyObject *feature_import(PyObject * /* self */, PyObject *args, PyObject
// feature_import did not handle it, so call the normal import.
Py_DECREF(ret);
static PyObject *builtins = PyEval_GetBuiltins();
- PyObject *import_func = PyDict_GetItemString(builtins, "__orig_import__");
- if (import_func == nullptr) {
+ PyObject *origImportFunc = PyDict_GetItemString(builtins, "__orig_import__");
+ if (origImportFunc == nullptr) {
Py_FatalError("builtins has no \"__orig_import__\" function");
}
- ret = PyObject_Call(import_func, args, kwds);
+ // PYSIDE-3054: Instead of just calling the original import, we temporarily
+ // reset the whole import function to the previous version.
+ // This prevents unforeseen recursions like in settrace.
+ PyObject *featureImportFunc = PyDict_GetItemString(builtins, "__import__");
+ Py_INCREF(origImportFunc);
+ Py_INCREF(featureImportFunc);
+ PyDict_SetItemString(builtins, "__import__", origImportFunc);
+ ret = PyObject_Call(origImportFunc, args, kwds);
if (ret) {
// PYSIDE-2029: Intercept after the import to search for PySide usage.
PyObject *post = PyObject_CallFunctionObjArgs(pyside_globals->feature_imported_func,
@@ -315,9 +322,12 @@ static PyObject *feature_import(PyObject * /* self */, PyObject *args, PyObject
Py_XDECREF(post);
if (post == nullptr) {
Py_DECREF(ret);
- return nullptr;
+ ret = nullptr;
}
}
+ PyDict_SetItemString(builtins, "__import__", featureImportFunc);
+ Py_DECREF(origImportFunc);
+ Py_DECREF(featureImportFunc);
return ret;
}