diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2015-06-26 14:52:22 +0300 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2015-06-26 14:52:22 +0300 |
commit | c73c1002331b2c0de0eaf555b5f1d05149f9a3b0 (patch) | |
tree | 7409e4b8e31e7455006c6b778764e0a42a2620e7 | |
parent | ac1e243a78040b056a79da2d194a648faca717e8 (diff) | |
download | bluez-c73c1002331b2c0de0eaf555b5f1d05149f9a3b0.tar.gz |
core/advertising: Fix using wrong instance id
The instance id shall be limited to the number of instance the kernel
support, and since this will probably be quite small the ids should be
reused once the client unregistered.
-rw-r--r-- | src/advertising.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/advertising.c b/src/advertising.c index ab5c6fc53..d56b7a248 100644 --- a/src/advertising.c +++ b/src/advertising.c @@ -48,7 +48,7 @@ struct btd_advertising { uint16_t mgmt_index; uint8_t max_adv_len; uint8_t max_ads; - unsigned int next_instance_id; + unsigned int instance_bitmap; }; #define AD_TYPE_BROADCAST 0 @@ -155,6 +155,8 @@ static void advertisement_remove(void *data) queue_remove(ad->manager->ads, ad); + util_clear_uid(&ad->manager->instance_bitmap, ad->instance); + g_idle_add(advertisement_free_idle_cb, ad); } @@ -633,6 +635,7 @@ static DBusMessage *register_advertisement(DBusConnection *conn, DBusMessageIter args; struct advertisement *ad; struct dbus_obj_match match; + uint8_t instance; DBG("RegisterAdvertisement"); @@ -649,7 +652,8 @@ static DBusMessage *register_advertisement(DBusConnection *conn, if (queue_find(manager->ads, match_advertisement, &match)) return btd_error_already_exists(msg); - if (queue_length(manager->ads) >= manager->max_ads) + instance = util_get_uid(&manager->instance_bitmap, manager->max_ads); + if (!instance) return btd_error_failed(msg, "Maximum advertisements reached"); dbus_message_iter_next(&args); @@ -664,7 +668,7 @@ static DBusMessage *register_advertisement(DBusConnection *conn, DBG("Registered advertisement at path %s", match.path); - ad->instance = manager->next_instance_id++; + ad->instance = instance; ad->manager = manager; queue_push_tail(manager->ads, ad); @@ -786,8 +790,6 @@ advertising_manager_create(struct btd_adapter *adapter) manager->ads = queue_new(); - manager->next_instance_id = 1; - return manager; } |