summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2013-06-23 23:39:56 (GMT)
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-08-03 01:41:37 (GMT)
commitc776e155a904527a36a1ba9c788c344ca171780c (patch)
tree4ecca273b1e311fd674f6ffe7eda107fc915c84c /src
parent0da444ac7bc72449a827c3c49f9333f58b2b0e10 (diff)
downloadQt-c776e155a904527a36a1ba9c788c344ca171780c.zip
Qt-c776e155a904527a36a1ba9c788c344ca171780c.tar.gz
Qt-c776e155a904527a36a1ba9c788c344ca171780c.tar.bz2
Don't crash if the relayed signal was emitted from the wrong thread
Under normal circumstances, this should never happen. Signals exported to D-Bus should only be emitted from the object's own thread. That's the only way for the receiver (the QDBusAdaptorConnector object) to know what the sender object and signal were. If they are emitted from another thread, the sender will be null. Task-number: QTBUG-31932 Change-Id: Ia5a45d648985e0645bffd4abc0881fca9da64f79 (cherry-picked from qtbase commit d94961d08f91696824d9035f666af5fe28d59ef6) Reviewed-by: Peter Seiderer <ps.report@gmx.net> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src')
-rw-r--r--src/dbus/qdbusabstractadaptor.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/dbus/qdbusabstractadaptor.cpp b/src/dbus/qdbusabstractadaptor.cpp
index 84c30cd..9ce843e 100644
--- a/src/dbus/qdbusabstractadaptor.cpp
+++ b/src/dbus/qdbusabstractadaptor.cpp
@@ -267,7 +267,15 @@ void QDBusAdaptorConnector::polish()
void QDBusAdaptorConnector::relaySlot(void **argv)
{
QObjectPrivate *d = static_cast<QObjectPrivate *>(d_ptr.data());
- relay(d->currentSender->sender, d->currentSender->signal, argv);
+ if (Q_LIKELY(d->currentSender)) {
+ relay(d->currentSender->sender, d->currentSender->signal, argv);
+ } else {
+ qWarning("QtDBus: cannot relay signals from parent %s(%p \"%s\") unless they are emitted in the object's thread %s(%p \"%s\"). "
+ "Current thread is %s(%p \"%s\").",
+ parent()->metaObject()->className(), parent(), qPrintable(parent()->objectName()),
+ parent()->thread()->metaObject()->className(), parent()->thread(), qPrintable(parent()->thread()->objectName()),
+ QThread::currentThread()->metaObject()->className(), QThread::currentThread(), qPrintable(QThread::currentThread()->objectName()));
+ }
}
void QDBusAdaptorConnector::relay(QObject *senderObj, int lastSignalIdx, void **argv)