diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-05-17 08:48:03 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-05-17 10:47:41 +0000 |
commit | dfa32dcec82c0916124661788cf527c5bdb68c1c (patch) | |
tree | d862444f3891b4e99db33981dacdff7c9ef2189b | |
parent | 2368bbdfd7032f1d7f74c036a5bf14854015c835 (diff) |
PySide6: Prevent crash when connecting to temporary signal sources
Add a check to the connect function.
Fixes: PYSIDE-2328
Change-Id: I62a10ef5710487f8ab23cc46c1cc4a34fab5e2b1
Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
(cherry picked from commit 9af348ae68363fefea62d75d508812bafc71ccf8)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | sources/pyside6/libpyside/pysidesignal.cpp | 5 | ||||
-rw-r--r-- | sources/pyside6/tests/QtCore/destroysignal_test.py | 7 |
2 files changed, 11 insertions, 1 deletions
diff --git a/sources/pyside6/libpyside/pysidesignal.cpp b/sources/pyside6/libpyside/pysidesignal.cpp index 17071cd1d..ad2a42802 100644 --- a/sources/pyside6/libpyside/pysidesignal.cpp +++ b/sources/pyside6/libpyside/pysidesignal.cpp @@ -441,6 +441,11 @@ static PyObject *signalInstanceConnect(PyObject *self, PyObject *args, PyObject PyErr_Format(PyExc_RuntimeError, "cannot connect uninitialized SignalInstance"); return nullptr; } + if (source->deleted) { + PyErr_Format(PyExc_RuntimeError, "Signal source has been deleted"); + return nullptr; + } + Shiboken::AutoDecRef pyArgs(PyList_New(0)); bool match = false; diff --git a/sources/pyside6/tests/QtCore/destroysignal_test.py b/sources/pyside6/tests/QtCore/destroysignal_test.py index f1d7cfec1..ad087b489 100644 --- a/sources/pyside6/tests/QtCore/destroysignal_test.py +++ b/sources/pyside6/tests/QtCore/destroysignal_test.py @@ -57,7 +57,7 @@ class Foo(QObject): self.s.emit(i) -# PYSIDE-2201: This crashed until we introduced a weak reference. +# PYSIDE-2201/2328: This crashed until we introduced a weak reference. class TestDestroyNoConnect(unittest.TestCase): def testSignalDestroyedMissingReference(self): @@ -67,6 +67,11 @@ class TestDestroyNoConnect(unittest.TestCase): with self.assertRaises(RuntimeError): Foo().s.emit(44) + def testSignalDestroyedinConnect(self): + # PYSIDE-2328: Connect to signal of temporary + with self.assertRaises(RuntimeError): + Foo().s.connect(None) + if __name__ == '__main__': unittest.main() |