From 25cf5dabbe0c1a4321e414d6fd1859f614442747 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Nowacki?= Date: Wed, 14 Mar 2012 09:46:02 +0100 Subject: Fix a memory leak in template QMetaObject::Connection. QObject::QSlotObjectBase instance given as argument to QObject::connectImpl was not dereferenced in case of an unsuccessful connection. Change-Id: I206b14e986690c027aafc2593762d85dc619e0e6 Reviewed-by: Olivier Goffart --- src/corelib/kernel/qobject.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src/corelib/kernel/qobject.cpp') diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index b648432e11..25adee7cc7 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -3991,6 +3991,8 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa { if (!sender || !signal || !slotObj || !senderMetaObject) { qWarning("QObject::connect: invalid null parametter"); + if (slotObj && !slotObj->ref.deref()) + delete slotObj; return QMetaObject::Connection(); } int signal_index = -1; @@ -3998,6 +4000,8 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa senderMetaObject->static_metacall(QMetaObject::IndexOfMethod, 0, args); if (signal_index < 0 || signal_index >= QMetaObjectPrivate::get(senderMetaObject)->signalCount) { qWarning("QObject::connect: signal not found in %s", senderMetaObject->className()); + if (!slotObj->ref.deref()) + delete slotObj; return QMetaObject::Connection(0); } int signalOffset, methodOffset; @@ -4017,8 +4021,11 @@ QMetaObject::Connection QObject::connectImpl(const QObject *sender, void **signa (*connectionLists)[signal_index].first; while (c2) { - if (c2->receiver == receiver && c2->isSlotObject && c2->slotObj->compare(slot)) + if (c2->receiver == receiver && c2->isSlotObject && c2->slotObj->compare(slot)) { + if (!slotObj->ref.deref()) + delete slotObj; return QMetaObject::Connection(); + } c2 = c2->nextConnectionList; } } -- cgit v1.2.3