Check error before call dbus_message_get_args to acquire arguments
authorMartin Xu <martin.xu@intel.com>
Tue, 27 Apr 2010 09:49:12 +0000 (17:49 +0800)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 6 May 2010 05:34:10 +0000 (07:34 +0200)
Function dbus_message_get_args just checks the signature which may
happens to be s(string), then it will just return TRUE, and the error
message is treated as return value.
So dbus_set_error_from_message is used to check the error, before
call dbus_message_get_args.

plugins/bluetooth.c

index 1c0fa96..fabc75f 100644 (file)
@@ -89,6 +89,12 @@ static void connect_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
+       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+               connman_error("%s", error.message);
+               dbus_error_free(&error);
+               goto done;
+       }
+
        if (dbus_message_get_args(reply, &error,
                                        DBUS_TYPE_STRING, &interface,
                                                DBUS_TYPE_INVALID) == FALSE) {
@@ -171,6 +177,12 @@ static void disconnect_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
+       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+               connman_error("%s", error.message);
+               dbus_error_free(&error);
+               goto done;
+       }
+
        if (dbus_message_get_args(reply, &error, DBUS_TYPE_INVALID) == FALSE) {
                if (dbus_error_is_set(&error) == TRUE) {
                        connman_error("%s", error.message);
@@ -625,6 +637,12 @@ static void list_adapters_reply(DBusPendingCall *call, void *user_data)
 
        dbus_error_init(&error);
 
+       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+               connman_error("%s", error.message);
+               dbus_error_free(&error);
+               goto done;
+       }
+
        if (dbus_message_get_args(reply, &error,
                                DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH,
                                                &adapters, &num_adapters,
@@ -717,14 +735,24 @@ static void bluetooth_remove(struct connman_device *device)
 
 static void powered_reply(DBusPendingCall *call, void *user_data)
 {
+       DBusError error;
        DBusMessage *reply;
 
        DBG("");
 
        reply = dbus_pending_call_steal_reply(call);
 
-       dbus_message_unref(reply);
+       dbus_error_init(&error);
 
+       if (dbus_set_error_from_message(&error, reply) == TRUE) {
+               connman_error("%s", error.message);
+               dbus_error_free(&error);
+               dbus_message_unref(reply);
+               dbus_pending_call_unref(call);
+               return;
+       }
+
+       dbus_message_unref(reply);
        dbus_pending_call_unref(call);
 
        add_adapter(connection, user_data);