Fix crash when using signaldumper and sender is deleted
Testlib's signaldumper functionality would crash inside testlib as it dereferenced the sender after it was deleted. Change-Id: I6013b75b0a121e2768429d8a3cf0339a940314f2 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
parent
4f757e0757
commit
895a786827
@ -3908,11 +3908,12 @@ void doActivate(QObject *sender, int signal_index, void **argv)
|
|||||||
if (connections->currentConnectionId.loadRelaxed() == 0)
|
if (connections->currentConnectionId.loadRelaxed() == 0)
|
||||||
senderDeleted = true;
|
senderDeleted = true;
|
||||||
}
|
}
|
||||||
if (!senderDeleted)
|
if (!senderDeleted) {
|
||||||
sp->connections.loadRelaxed()->cleanOrphanedConnections(sender);
|
sp->connections.loadRelaxed()->cleanOrphanedConnections(sender);
|
||||||
|
|
||||||
if (callbacks_enabled && signal_spy_set->signal_end_callback != nullptr)
|
if (callbacks_enabled && signal_spy_set->signal_end_callback != nullptr)
|
||||||
signal_spy_set->signal_end_callback(sender, signal_index);
|
signal_spy_set->signal_end_callback(sender, signal_index);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -568,11 +568,18 @@
|
|||||||
<Incident type="pass" file="" line="0" />
|
<Incident type="pass" file="" line="0" />
|
||||||
<Duration msecs="0"/>
|
<Duration msecs="0"/>
|
||||||
</TestFunction>
|
</TestFunction>
|
||||||
|
<TestFunction name="deletingSender">
|
||||||
|
<Message type="info" file="" line="0">
|
||||||
|
<Description><![CDATA[Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()]]></Description>
|
||||||
|
</Message>
|
||||||
|
<Incident type="pass" file="" line="0" />
|
||||||
|
<Duration msecs="0"/>
|
||||||
|
</TestFunction>
|
||||||
<TestFunction name="cleanupTestCase">
|
<TestFunction name="cleanupTestCase">
|
||||||
<Incident type="pass" file="" line="0" />
|
<Incident type="pass" file="" line="0" />
|
||||||
<Duration msecs="0"/>
|
<Duration msecs="0"/>
|
||||||
</TestFunction>
|
</TestFunction>
|
||||||
<Message type="info" file="" line="0">
|
<Message type="info" file="" line="0">
|
||||||
<Description><![CDATA[Signal: QThread(_POINTER_) finished ()]]></Description>
|
<Description><![CDATA[ Signal: QThread(_POINTER_) finished ()]]></Description>
|
||||||
</Message>
|
</Message>
|
||||||
<Duration msecs="0"/>
|
<Duration msecs="0"/>
|
||||||
|
@ -143,9 +143,11 @@ ok 18 - slotEmittingSignalOldSyntax(queued)
|
|||||||
# Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())
|
# Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())
|
||||||
# Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())
|
# Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())
|
||||||
ok 19 - variousTypes()
|
ok 19 - variousTypes()
|
||||||
ok 20 - cleanupTestCase()
|
# Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()
|
||||||
# Signal: QThread(_POINTER_) finished ()
|
ok 20 - deletingSender()
|
||||||
1..20
|
ok 21 - cleanupTestCase()
|
||||||
# tests 20
|
# Signal: QThread(_POINTER_) finished ()
|
||||||
# pass 20
|
1..21
|
||||||
|
# tests 21
|
||||||
|
# pass 21
|
||||||
# fail 0
|
# fail 0
|
||||||
|
@ -56,6 +56,9 @@
|
|||||||
##teamcity[testStarted name='variousTypes()' flowId='tst_Signaldumper']
|
##teamcity[testStarted name='variousTypes()' flowId='tst_Signaldumper']
|
||||||
##teamcity[testStdOut name='variousTypes()' out='INFO: Signal: SignalSlotClass(_POINTER_) qStringSignal (QString(Test string))|nINFO: Signal: SignalSlotClass(_POINTER_) qStringRefSignal ((QString&)@_POINTER_)|nINFO: Signal: SignalSlotClass(_POINTER_) qStringConstRefSignal (QString(Test string))|nINFO: Signal: SignalSlotClass(_POINTER_) qByteArraySignal (QByteArray(Test bytearray))|nINFO: Signal: SignalSlotClass(_POINTER_) qListSignal (QList<int>())|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorSignal (QVector<int>())|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorRefSignal ((QVector<int>&)@_POINTER_)|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorConstRefSignal (QVector<int>())|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorConstPointerSignal ((const QVector<int>*)_POINTER_)|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorPointerConstSignal ()|nINFO: Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())|nINFO: Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())' flowId='tst_Signaldumper']
|
##teamcity[testStdOut name='variousTypes()' out='INFO: Signal: SignalSlotClass(_POINTER_) qStringSignal (QString(Test string))|nINFO: Signal: SignalSlotClass(_POINTER_) qStringRefSignal ((QString&)@_POINTER_)|nINFO: Signal: SignalSlotClass(_POINTER_) qStringConstRefSignal (QString(Test string))|nINFO: Signal: SignalSlotClass(_POINTER_) qByteArraySignal (QByteArray(Test bytearray))|nINFO: Signal: SignalSlotClass(_POINTER_) qListSignal (QList<int>())|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorSignal (QVector<int>())|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorRefSignal ((QVector<int>&)@_POINTER_)|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorConstRefSignal (QVector<int>())|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorConstPointerSignal ((const QVector<int>*)_POINTER_)|nINFO: Signal: SignalSlotClass(_POINTER_) qVectorPointerConstSignal ()|nINFO: Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())|nINFO: Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())' flowId='tst_Signaldumper']
|
||||||
##teamcity[testFinished name='variousTypes()' flowId='tst_Signaldumper']
|
##teamcity[testFinished name='variousTypes()' flowId='tst_Signaldumper']
|
||||||
|
##teamcity[testStarted name='deletingSender()' flowId='tst_Signaldumper']
|
||||||
|
##teamcity[testStdOut name='deletingSender()' out='INFO: Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()' flowId='tst_Signaldumper']
|
||||||
|
##teamcity[testFinished name='deletingSender()' flowId='tst_Signaldumper']
|
||||||
##teamcity[testStarted name='cleanupTestCase()' flowId='tst_Signaldumper']
|
##teamcity[testStarted name='cleanupTestCase()' flowId='tst_Signaldumper']
|
||||||
##teamcity[testFinished name='cleanupTestCase()' flowId='tst_Signaldumper']
|
##teamcity[testFinished name='cleanupTestCase()' flowId='tst_Signaldumper']
|
||||||
##teamcity[testSuiteFinished name='tst_Signaldumper' flowId='tst_Signaldumper']
|
##teamcity[testSuiteFinished name='tst_Signaldumper' flowId='tst_Signaldumper']
|
||||||
|
@ -143,7 +143,9 @@ INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qVe
|
|||||||
INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())
|
INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())
|
||||||
INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())
|
INFO : tst_Signaldumper::variousTypes() Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())
|
||||||
PASS : tst_Signaldumper::variousTypes()
|
PASS : tst_Signaldumper::variousTypes()
|
||||||
|
INFO : tst_Signaldumper::deletingSender() Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()
|
||||||
|
PASS : tst_Signaldumper::deletingSender()
|
||||||
PASS : tst_Signaldumper::cleanupTestCase()
|
PASS : tst_Signaldumper::cleanupTestCase()
|
||||||
INFO : tst_Signaldumper::UnknownTestFunc() Signal: QThread(_POINTER_) finished ()
|
INFO : tst_Signaldumper::UnknownTestFunc() Signal: QThread(_POINTER_) finished ()
|
||||||
Totals: 20 passed, 0 failed, 0 skipped, 0 blacklisted, 0ms
|
Totals: 21 passed, 0 failed, 0 skipped, 0 blacklisted, 0ms
|
||||||
********* Finished testing of tst_Signaldumper *********
|
********* Finished testing of tst_Signaldumper *********
|
||||||
|
@ -570,12 +570,19 @@
|
|||||||
<Incident type="pass" file="" line="0" />
|
<Incident type="pass" file="" line="0" />
|
||||||
<Duration msecs="0"/>
|
<Duration msecs="0"/>
|
||||||
</TestFunction>
|
</TestFunction>
|
||||||
|
<TestFunction name="deletingSender">
|
||||||
|
<Message type="info" file="" line="0">
|
||||||
|
<Description><![CDATA[Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()]]></Description>
|
||||||
|
</Message>
|
||||||
|
<Incident type="pass" file="" line="0" />
|
||||||
|
<Duration msecs="0"/>
|
||||||
|
</TestFunction>
|
||||||
<TestFunction name="cleanupTestCase">
|
<TestFunction name="cleanupTestCase">
|
||||||
<Incident type="pass" file="" line="0" />
|
<Incident type="pass" file="" line="0" />
|
||||||
<Duration msecs="0"/>
|
<Duration msecs="0"/>
|
||||||
</TestFunction>
|
</TestFunction>
|
||||||
<Message type="info" file="" line="0">
|
<Message type="info" file="" line="0">
|
||||||
<Description><![CDATA[Signal: QThread(_POINTER_) finished ()]]></Description>
|
<Description><![CDATA[ Signal: QThread(_POINTER_) finished ()]]></Description>
|
||||||
</Message>
|
</Message>
|
||||||
<Duration msecs="0"/>
|
<Duration msecs="0"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<testsuite errors="125" failures="0" tests="12" name="tst_Signaldumper">
|
<testsuite errors="126" failures="0" tests="13" name="tst_Signaldumper">
|
||||||
<properties>
|
<properties>
|
||||||
<property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
|
<property value="@INSERT_QT_VERSION_HERE@" name="QTestVersion"/>
|
||||||
<property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
|
<property value="@INSERT_QT_VERSION_HERE@" name="QtVersion"/>
|
||||||
@ -151,8 +151,11 @@
|
|||||||
<!-- message="Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())" type="info" -->
|
<!-- message="Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())" type="info" -->
|
||||||
<!-- message="Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())" type="info" -->
|
<!-- message="Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())" type="info" -->
|
||||||
</testcase>
|
</testcase>
|
||||||
|
<testcase result="pass" name="deletingSender">
|
||||||
|
<!-- message="Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()" type="info" -->
|
||||||
|
</testcase>
|
||||||
<testcase result="pass" name="cleanupTestCase">
|
<testcase result="pass" name="cleanupTestCase">
|
||||||
<!-- message="Signal: QThread(_POINTER_) finished ()" type="info" -->
|
<!-- message=" Signal: QThread(_POINTER_) finished ()" type="info" -->
|
||||||
</testcase>
|
</testcase>
|
||||||
<system-err>
|
<system-err>
|
||||||
<![CDATA[Signal: QThread(_POINTER_) started ()]]>
|
<![CDATA[Signal: QThread(_POINTER_) started ()]]>
|
||||||
@ -279,6 +282,7 @@
|
|||||||
<![CDATA[Signal: SignalSlotClass(_POINTER_) qVectorPointerConstSignal ()]]>
|
<![CDATA[Signal: SignalSlotClass(_POINTER_) qVectorPointerConstSignal ()]]>
|
||||||
<![CDATA[Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())]]>
|
<![CDATA[Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())]]>
|
||||||
<![CDATA[Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())]]>
|
<![CDATA[Signal: SignalSlotClass(_POINTER_) qVariantSignal (QVariant())]]>
|
||||||
<![CDATA[Signal: QThread(_POINTER_) finished ()]]>
|
<![CDATA[Signal: SignalSlotClass(_POINTER_) signalWithoutParameters ()]]>
|
||||||
|
<![CDATA[ Signal: QThread(_POINTER_) finished ()]]>
|
||||||
</system-err>
|
</system-err>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
|
@ -56,6 +56,8 @@ private slots:
|
|||||||
void slotEmittingSignalOldSyntax();
|
void slotEmittingSignalOldSyntax();
|
||||||
|
|
||||||
void variousTypes();
|
void variousTypes();
|
||||||
|
|
||||||
|
void deletingSender();
|
||||||
};
|
};
|
||||||
|
|
||||||
void tst_Signaldumper::addConnectionTypeData()
|
void tst_Signaldumper::addConnectionTypeData()
|
||||||
@ -413,5 +415,14 @@ void tst_Signaldumper::variousTypes()
|
|||||||
emit signalSlotOwner.qVariantSignal(variant);
|
emit signalSlotOwner.qVariantSignal(variant);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_Signaldumper::deletingSender()
|
||||||
|
{
|
||||||
|
SignalSlotClass *signalSlotOwner = new SignalSlotClass();
|
||||||
|
connect(signalSlotOwner, &SignalSlotClass::signalWithoutParameters, [signalSlotOwner]() {
|
||||||
|
delete signalSlotOwner;
|
||||||
|
});
|
||||||
|
emit signalSlotOwner->signalWithoutParameters();
|
||||||
|
}
|
||||||
|
|
||||||
QTEST_MAIN(tst_Signaldumper)
|
QTEST_MAIN(tst_Signaldumper)
|
||||||
#include "tst_signaldumper.moc"
|
#include "tst_signaldumper.moc"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user