Skip to content

Commit 970f19b

Browse files
author
Thiago Macieira
committed
Fix crash in QDBusPendingReply/QDBusReply in case of unconnected calls.
If we made calls on a QDBusConnection that isn't connected, the d pointer is 0. Ensure we don't crash. Task-number: QTBUG-6571 Reviewed-by: Bradley T. Hughes
1 parent 0b78ccc commit 970f19b

File tree

4 files changed

+43
-1
lines changed

4 files changed

+43
-1
lines changed

src/dbus/qdbuspendingcall.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ QDBusPendingCall &QDBusPendingCall::operator=(const QDBusPendingCall &other)
310310

311311
bool QDBusPendingCall::isFinished() const
312312
{
313-
return d && (d->replyMessage.type() != QDBusMessage::InvalidMessage);
313+
return !d || (d->replyMessage.type() != QDBusMessage::InvalidMessage);
314314
}
315315

316316
void QDBusPendingCall::waitForFinished()

src/dbus/qdbuspendingreply.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ class QDBusPendingReply:
188188
private:
189189
inline void calculateMetaTypes()
190190
{
191+
if (!d) return;
191192
int typeIds[Count > 0 ? Count : 1]; // use at least one since zero-sized arrays aren't valid
192193
ForEach::fillMetaTypes(typeIds);
193194
setMetaTypes(Count, typeIds);

tests/auto/qdbuspendingreply/tst_qdbuspendingreply.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ private slots:
9393
}
9494

9595
void init();
96+
void unconnected();
9697
void simpleTypes();
9798
void complexTypes();
9899
void wrongTypes();
@@ -252,6 +253,30 @@ void tst_QDBusPendingReply::init()
252253
QVERIFY(iface->isValid());
253254
}
254255

256+
void tst_QDBusPendingReply::unconnected()
257+
{
258+
QDBusConnection con("invalid stored connection");
259+
QVERIFY(!con.isConnected());
260+
QDBusInterface iface("doesnt.matter", "/", "doesnt.matter", con);
261+
QVERIFY(!iface.isValid());
262+
263+
QDBusPendingReply<> rvoid = iface.asyncCall("ReloadConfig");
264+
QVERIFY(rvoid.isFinished());
265+
QVERIFY(!rvoid.isValid());
266+
QVERIFY(rvoid.isError());
267+
rvoid.waitForFinished();
268+
QVERIFY(!rvoid.isValid());
269+
QVERIFY(rvoid.isError());
270+
271+
QDBusPendingReply<QString> rstring = iface.asyncCall("GetId");
272+
QVERIFY(rstring.isFinished());
273+
QVERIFY(!rstring.isValid());
274+
QVERIFY(rstring.isError());
275+
rstring.waitForFinished();
276+
QVERIFY(!rstring.isValid());
277+
QVERIFY(rstring.isError());
278+
}
279+
255280
void tst_QDBusPendingReply::simpleTypes()
256281
{
257282
QDBusPendingReply<> rvoid = iface->asyncCall("retrieveVoid");

tests/auto/qdbusreply/tst_qdbusreply.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ private slots:
9393
}
9494

9595
void init();
96+
void unconnected();
9697
void simpleTypes();
9798
void complexTypes();
9899
void wrongTypes();
@@ -236,6 +237,21 @@ void tst_QDBusReply::init()
236237
QVERIFY(iface->isValid());
237238
}
238239

240+
void tst_QDBusReply::unconnected()
241+
{
242+
QDBusConnection con("invalid stored connection");
243+
QVERIFY(!con.isConnected());
244+
QDBusInterface iface("doesnt.matter", "/", "doesnt.matter", con);
245+
QVERIFY(!iface.isValid());
246+
247+
QDBusReply<void> rvoid = iface.asyncCall("ReloadConfig");
248+
QVERIFY(!rvoid.isValid());
249+
250+
QDBusReply<QString> rstring = iface.asyncCall("GetId");
251+
QVERIFY(!rstring.isValid());
252+
QVERIFY(rstring.value().isEmpty());
253+
}
254+
239255
void tst_QDBusReply::simpleTypes()
240256
{
241257
QDBusReply<bool> rbool = iface->call(QDBus::BlockWithGui, "retrieveBool");

0 commit comments

Comments
 (0)