On Wed, 2012-07-25 at 16:29 +0200, Mikel Astiz wrote: > +static int parse_manager_property(pa_bluetooth_discovery *y, DBusMessageIter *i) { > + const char *key; > + DBusMessageIter variant_i; > + > + pa_assert(y); > + > + key = check_variant_property(i); > + if (key == NULL) > + return -1; The same tab (see my previous message) spotted here too. > + > + dbus_message_iter_recurse(i, &variant_i); > + > + switch (dbus_message_iter_get_arg_type(&variant_i)) { > + > + case DBUS_TYPE_ARRAY: { > + > + DBusMessageIter ai; > + dbus_message_iter_recurse(&variant_i, &ai); > + > + if (dbus_message_iter_get_arg_type(&ai) == DBUS_TYPE_OBJECT_PATH && > + pa_streq(key, "Adapters")) { > + > + while (dbus_message_iter_get_arg_type(&ai) != DBUS_TYPE_INVALID) { > + const char *value; > + > + dbus_message_iter_get_basic(&ai, &value); > + > + found_adapter(y, value); > + > + if (!dbus_message_iter_next(&ai)) > + break; No need to check dbus_message_iter_next() return value here. The loop will terminate anyway, because dbus_message_iter_get_arg_type() will return DBUS_TYPE_INVALID. > @@ -430,7 +472,8 @@ static void get_properties_reply(DBusPendingCall *pending, void *userdata) { > /* We don't use p->call_data here right-away since the device > * might already be invalidated at this point */ > > - if (!(d = pa_hashmap_get(y->devices, dbus_message_get_path(p->message)))) > + d = pa_hashmap_get(y->devices, dbus_message_get_path(p->message)); > + if (d == NULL && !dbus_message_has_interface(p->message, "org.bluez.Manager")) > return; > > pa_assert(p->call_data == d); > @@ -469,7 +512,11 @@ static void get_properties_reply(DBusPendingCall *pending, void *userdata) { > > dbus_message_iter_recurse(&element_i, &dict_i); > > - if (dbus_message_has_interface(p->message, "org.bluez.Device")) { > + if (dbus_message_has_interface(p->message, "org.bluez.Manager")) { > + if (parse_manager_property(y, &dict_i) < 0) > + goto finish; > + > + } else if (dbus_message_has_interface(p->message, "org.bluez.Device")) { > if (parse_device_property(y, d, &dict_i) < 0) > goto finish; > > @@ -501,7 +548,8 @@ static void get_properties_reply(DBusPendingCall *pending, void *userdata) { > } > > finish: > - run_callback(y, d, FALSE); > + if (d != NULL) > + run_callback(y, d, FALSE); We don't want to call run_callback() when we have processed Manager properties, but the "d != NULL" check doesn't check that. It checks that did the message come from an object path that has previously been associated with a device. If we get Manager properties from a device object, then run_callback() will be called. It of course also means that bluetoothd is broken, but we should protect us against broken bluetoothd. -- Tanu