From e3a16c28e4799d53141c9fdf10d248648d560bd8 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 1 Oct 2025 10:27:37 -0400 Subject: [PATCH] device: Fix privacy In order for devices to properly be programmed into the adapter resolving list they need to set the flag DEVICE_FLAG_ADDRESS_RESOLUTION but that is only done if device_address_is_private return true but currently it doesn't check the rpa flag which indicates that the address has been updated to its identity. While at it this also update the rpa flag to privacy to better indicate the feature rather than just the address type and then introduces device_set_privacy/device_get_privacy and replaces the usage of device_address_is_private with device_get_privacy whenever the features itself needs to be checked, rather than the current address type in use. Fixes: https://github.com/bluez/bluez/issues/1079 --- src/adapter.c | 4 ++-- src/device.c | 16 ++++++++++++---- src/device.h | 3 ++- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index dc5ba65d7..3afcb9277 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -5091,7 +5091,7 @@ static void load_devices(struct btd_adapter *adapter) goto free; if (irk_info) - device_set_rpa(device, true); + device_set_privacy(device, true); btd_device_set_temporary(device, false); adapter_add_device(adapter, device); @@ -5752,7 +5752,7 @@ void adapter_set_device_flags(struct btd_adapter *adapter, /* Set Address Resolution if it has not been set the flag yet. */ if (ll_privacy && btd_opts.defaults.le.addr_resolution && - device_address_is_private(device) && + device_get_privacy(device) && !(flags & DEVICE_FLAG_ADDRESS_RESOLUTION)) flags |= DEVICE_FLAG_ADDRESS_RESOLUTION & supported & ~pending; diff --git a/src/device.c b/src/device.c index 8b3e78995..9f0e8e673 100644 --- a/src/device.c +++ b/src/device.c @@ -204,7 +204,7 @@ struct btd_device { uint8_t conn_bdaddr_type; bdaddr_t bdaddr; uint8_t bdaddr_type; - bool rpa; + bool privacy; char *path; struct btd_bearer *bredr; struct btd_bearer *le; @@ -4995,9 +4995,17 @@ void device_set_class(struct btd_device *device, uint32_t class) DEVICE_INTERFACE, "Icon"); } -void device_set_rpa(struct btd_device *device, bool value) +void device_set_privacy(struct btd_device *device, bool value) { - device->rpa = value; + device->privacy = value; +} + +bool device_get_privacy(struct btd_device *device) +{ + if (device->privacy) + return true; + + return device_address_is_private(device); } void device_update_addr(struct btd_device *device, const bdaddr_t *bdaddr, @@ -5005,7 +5013,7 @@ void device_update_addr(struct btd_device *device, const bdaddr_t *bdaddr, { bool auto_connect = device->auto_connect; - device_set_rpa(device, true); + device_set_privacy(device, true); if (!bacmp(bdaddr, &device->bdaddr) && bdaddr_type == device->bdaddr_type) diff --git a/src/device.h b/src/device.h index 9e7c30ad7..6fbbdb1f2 100644 --- a/src/device.h +++ b/src/device.h @@ -29,7 +29,8 @@ bool device_is_name_resolve_allowed(struct btd_device *device); void device_name_resolve_fail(struct btd_device *device); void device_set_class(struct btd_device *device, uint32_t class); bool device_address_is_private(struct btd_device *dev); -void device_set_rpa(struct btd_device *device, bool value); +void device_set_privacy(struct btd_device *device, bool value); +bool device_get_privacy(struct btd_device *device); void device_update_addr(struct btd_device *device, const bdaddr_t *bdaddr, uint8_t bdaddr_type); void device_set_bredr_support(struct btd_device *device); -- 2.47.3