summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzymon Janc <szymon.janc@tieto.com>2013-09-26 10:02:34 +0200
committerMarcel Holtmann <marcel@holtmann.org>2013-10-14 06:08:22 -0700
commit2be018f11e031c2ba41c4af82c9de63c7b3053c5 (patch)
treef8bbc58b387de10bd0a6fd92701487f0b94144de
parent50b9e60e62c5b544f42621b49fa8fedc8bf86735 (diff)
downloadneard-2be018f11e031c2ba41c4af82c9de63c7b3053c5.tar.gz
neard-2be018f11e031c2ba41c4af82c9de63c7b3053c5.tar.bz2
neard-2be018f11e031c2ba41c4af82c9de63c7b3053c5.zip
gdbus: Check for NULL DBusPendingCall in g_dbus_send_message_with_reply
"Warning: if the connection is disconnected or you try to send Unix file descriptors on a connection that does not support them, the DBusPendingCall will be set to NULL, so be careful with this." Check this in g_dbus_send_message_with_reply so that callers don't need to double check for NULL if g_dbus_send_message_with_reply returned TRUE. This also fix crash if passing FD over D-Bus is blocked e.g. by SELinux policy. bluetoothd[1894]: profiles/audio/avdtp.c:session_cb() bluetoothd[1894]: profiles/audio/avdtp.c:avdtp_parse_cmd() Received SET_CONFIGURATION_CMD bluetoothd[1894]: profiles/audio/a2dp.c:endpoint_setconf_ind() Source 0x6c5000: Set_Configuration_Ind bluetoothd[1894]: profiles/audio/avdtp.c:avdtp_ref() 0x6df360: ref=1 bluetoothd[1894]: profiles/audio/a2dp.c:setup_ref() 0x6d32b0: ref=1 process 1894: arguments to dbus_pending_call_set_notify() were incorrect, assertion "pending != NULL" failed in file dbus-pending-call.c line 636. This is normally a bug in some application using the D-Bus library.
-rw-r--r--gdbus/object.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/gdbus/object.c b/gdbus/object.c
index 0822fe8..268fed5 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -1510,11 +1510,20 @@ gboolean g_dbus_send_message_with_reply(DBusConnection *connection,
DBusMessage *message,
DBusPendingCall **call, int timeout)
{
+ dbus_bool_t ret;
+
/* Flush pending signal to guarantee message order */
g_dbus_flush(connection);
- return dbus_connection_send_with_reply(connection, message, call,
+ ret = dbus_connection_send_with_reply(connection, message, call,
timeout);
+
+ if (ret == TRUE && call != NULL && *call == NULL) {
+ error("Unable to send message (passing fd blocked?)");
+ return FALSE;
+ }
+
+ return ret;
}
gboolean g_dbus_send_error_valist(DBusConnection *connection,