From 833fa18c83ae8025f376dbe9eb8ac86fe65f15e6 Mon Sep 17 00:00:00 2001 From: Arman Uguray Date: Fri, 30 Jan 2015 16:29:08 -0800 Subject: [PATCH] core/device: Don't check ready in service_removed shared/gatt-client clears a given gatt-db if there's an error during its init sequence, even if the given gatt-db was previously populated (e.g. from a cache). This is to make sure that the database contents are at no point invalid. This patch removes a check for bt_gatt_client_is_ready and the corresponding early-return from btd_device's service_removed handler, so that other layers can be notified of invalidated gatt_db_attribute pointers. --- src/device.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/device.c b/src/device.c index 8dea70ba8..9cb5acb88 100644 --- a/src/device.c +++ b/src/device.c @@ -2762,8 +2762,21 @@ static void gatt_service_removed(struct gatt_db_attribute *attr, struct gatt_primary *prim; uint16_t start, end; - if (!bt_gatt_client_is_ready(device->client)) - return; + /* + * NOTE: shared/gatt-client clears the database in case of failure. This + * triggers the service_removed callback for all affected services. + * Hence, this function will be called in the following cases: + * + * 1. When a GATT service gets removed due to "Service Changed". + * + * 2. When a GATT service gets removed when the database get cleared + * upon disconnection with a non-bonded device. + * + * 3. When a GATT service gets removed when the database get cleared + * by shared/gatt-client when its initialization procedure fails, + * e.g. due to an ATT protocol error or an unexpected disconnect. + * In this case the gatt-client will not be ready. + */ gatt_db_attribute_get_service_handles(attr, &start, &end); -- 2.47.3