diff options
author | Luciano Wolf <luciano.wolf@openbossa.org> | 2009-12-17 15:44:09 -0300 |
---|---|---|
committer | Luciano Wolf <luciano.wolf@openbossa.org> | 2009-12-17 15:44:09 -0300 |
commit | 742d46f23f48018c2fafa036f30e01e6b55a8c2c (patch) | |
tree | 9b0a01d412363692cebfb7ffde5ca9da0cd727de /libpyside | |
parent | fb040f76c1752d929f48101a9205223f2d32a98d (diff) |
Fix memory corruption caused by tuple processing loop.
Diffstat (limited to 'libpyside')
-rw-r--r-- | libpyside/signalslotconnection.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/libpyside/signalslotconnection.cpp b/libpyside/signalslotconnection.cpp index f6391682e..125396345 100644 --- a/libpyside/signalslotconnection.cpp +++ b/libpyside/signalslotconnection.cpp @@ -60,20 +60,25 @@ SignalSlotConnection::~SignalSlotConnection() void SignalSlotConnection::trigger(PyObject* args) { Q_ASSERT(PySequence_Size(args) >= m_numSlotArgs); + const int useSelf = m_receiver ? 1 : 0; + int numSlotArgs = m_numSlotArgs; + + if (numSlotArgs == -1) + numSlotArgs = PySequence_Size(args) + useSelf; - PyObject* preparedArgs = PyTuple_New(m_numSlotArgs); + PyObject* preparedArgs = PyTuple_New(numSlotArgs); if (m_receiver) PyTuple_SetItem(preparedArgs, 0, m_receiver); - for (int i = 0; i < m_numSlotArgs; ++i) + for (int i = 0, max = numSlotArgs - useSelf; i < max; ++i) { PyTuple_SET_ITEM(preparedArgs, i + useSelf, PyTuple_GET_ITEM(args, i)); + } PyObject* retval = PyObject_CallObject(m_function, preparedArgs); if (retval) { Py_DECREF(retval); } else { - qWarning(qPrintable(QString("Error calling slot ")+ - PyString_AS_STRING(reinterpret_cast<PyCodeObject*>(PyFunction_GET_CODE(m_function))->co_name))); + qWarning("Error calling slot"); } Py_DECREF(preparedArgs); } |