From 2b52bed5584ab75a26765fbe86520d2bdb3aa1d4 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 12 Jun 2024 23:48:31 +0200 Subject: [PATCH] Gui: Fix possible crash when using Shiboken::Enum::getValue Fixes #14156 --- src/Gui/PythonWrapper.cpp | 51 ++++++++++++++++++++------------------- src/Gui/PythonWrapper.h | 3 +++ 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/Gui/PythonWrapper.cpp b/src/Gui/PythonWrapper.cpp index 40261e6cc2..eee35abc56 100644 --- a/src/Gui/PythonWrapper.cpp +++ b/src/Gui/PythonWrapper.cpp @@ -583,39 +583,40 @@ QObject* PythonWrapper::toQObject(const Py::Object& pyobject) return qt_getCppType(pyobject.ptr()); } +qsizetype PythonWrapper::tryEnum(PyObject* pyPtr) +{ + if (PyObject* number = PyNumber_Long(pyPtr)) { + Py::Long longObj(number, true); + return longObj.as_long(); + } + + // if PyNumber_Long failed then an exception is set + PyErr_Clear(); + + Py::Object object(pyPtr); + if (object.hasAttr(std::string("value"))) { + Py::Long longObj(object.getAttr(std::string("value"))); + return longObj.as_long(); + } + + return 0; +} + qsizetype PythonWrapper::toEnum(PyObject* pyPtr) { -#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) - if (PyLong_Check(pyPtr)) { - return PyLong_AsLong(pyPtr); + try { + return tryEnum(pyPtr); + } + catch (Py::Exception&) { + Base::PyException e; + e.ReportException(); + return 0; } - return Shiboken::Enum::getValue(pyPtr); -#else - return toEnum(Py::Object(pyPtr)); -#endif } qsizetype PythonWrapper::toEnum(const Py::Object& pyobject) { -#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) return toEnum(pyobject.ptr()); -#else - try { - qsizetype ret {}; - if (pyobject.hasAttr(std::string("value"))) { - ret = Py::Int(pyobject.getAttr(std::string("value"))); - } - else { - ret = Py::Int(pyobject); - } - return ret; - } - catch (Py::Exception&) { - Base::PyException e; // extract the Python error text - e.ReportException(); - return 0; - } -#endif } QGraphicsItem* PythonWrapper::toQGraphicsItem(PyObject* pyPtr) diff --git a/src/Gui/PythonWrapper.h b/src/Gui/PythonWrapper.h index 94c2f7fc50..39d6d61893 100644 --- a/src/Gui/PythonWrapper.h +++ b/src/Gui/PythonWrapper.h @@ -79,6 +79,9 @@ public: QDir* toQDir(PyObject* pyobj); static void createChildrenNameAttributes(PyObject* root, QObject* object); static void setParent(PyObject* pyWdg, QObject* parent); + +private: + qsizetype tryEnum(PyObject* pyPtr); }; } // namespace Gui