summaryrefslogtreecommitdiff
path: root/src/gatt-database.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-09-21 14:40:14 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2022-09-21 14:40:14 -0700
commitfbf17ac497bb2e0077c4cfa22583439e157693fe (patch)
tree9916cd24ca5c4e9da1be5ef87c29ca63f2855831 /src/gatt-database.c
parent115514d85a17dcc03da4f784c9d65c1e98491296 (diff)
downloadbluez-fbf17ac497bb2e0077c4cfa22583439e157693fe.tar.gz
gatt: Fix not setting permissions for CCC
CCC shall always have both Read and Write permissions set in addition to what application set. Fixes: https://github.com/bluez/bluez/issues/399
Diffstat (limited to 'src/gatt-database.c')
-rw-r--r--src/gatt-database.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/gatt-database.c b/src/gatt-database.c
index 89a3dc475..a212dfc4e 100644
--- a/src/gatt-database.c
+++ b/src/gatt-database.c
@@ -1238,7 +1238,8 @@ static void populate_gatt_service(struct btd_gatt_database *database)
NULL, NULL, database);
database->svc_chngd_ccc = service_add_ccc(service, database, NULL, NULL,
- 0, NULL);
+ BT_ATT_PERM_READ |
+ BT_ATT_PERM_WRITE, NULL);
bt_uuid16_create(&uuid, GATT_CHARAC_CLI_FEAT);
database->cli_feat = gatt_db_service_add_characteristic(service,
@@ -1726,8 +1727,10 @@ static bool parse_chrc_flags(DBusMessageIter *array, uint8_t *props,
*perm |= BT_ATT_PERM_WRITE;
} else if (!strcmp("notify", flag)) {
*props |= BT_GATT_CHRC_PROP_NOTIFY;
+ *ccc_perm |= BT_ATT_PERM_WRITE;
} else if (!strcmp("indicate", flag)) {
*props |= BT_GATT_CHRC_PROP_INDICATE;
+ *ccc_perm |= BT_ATT_PERM_WRITE;
} else if (!strcmp("authenticated-signed-writes", flag)) {
*props |= BT_GATT_CHRC_PROP_AUTH;
*perm |= BT_ATT_PERM_WRITE;
@@ -2896,6 +2899,9 @@ static bool database_add_ccc(struct external_service *service,
!(chrc->props & BT_GATT_CHRC_PROP_INDICATE))
return true;
+ /* Always set read/write permissions */
+ chrc->ccc_perm |= BT_ATT_PERM_WRITE | BT_ATT_PERM_READ;
+
chrc->ccc = service_add_ccc(service->attrib, service->app->database,
ccc_write_cb, chrc, chrc->ccc_perm, NULL);
if (!chrc->ccc) {