* RE: plugin/admin: Make allowlist adapter-scoped and enforce at runtime
2026-07-15 9:01 [PATCH BlueZ v2 1/8] plugins/admin: make AdminPolicy state per-adapter Frédéric Danis
@ 2026-07-15 10:16 ` bluez.test.bot
0 siblings, 0 replies; 10+ messages in thread
From: bluez.test.bot @ 2026-07-15 10:16 UTC (permalink / raw)
To: linux-bluetooth, frederic.danis
[-- Attachment #1: Type: text/plain, Size: 16846 bytes --]
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=1128023
---Test result---
Test Summary:
CheckPatch FAIL 9.37 seconds
GitLint FAIL 2.49 seconds
BuildEll PASS 20.09 seconds
BluezMake FAIL 497.06 seconds
MakeCheck FAIL 17.53 seconds
MakeDistcheck PASS 154.31 seconds
CheckValgrind FAIL 130.44 seconds
CheckSmatch PASS 304.01 seconds
bluezmakeextell PASS 99.54 seconds
IncrementalBuild FAIL 494.42 seconds
ScanBuild PASS 951.22 seconds
Details
##############################
Test: CheckPatch - FAIL
Desc: Run checkpatch.pl script
Output:
[BlueZ,v2,1/8] plugins/admin: make AdminPolicy state per-adapter
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#84:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#84:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14688438.patch total: 1 errors, 1 warnings, 259 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14688438.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[BlueZ,v2,2/8] client/bluetoothctl: make admin.allow controller-aware
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#81:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#81:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14688439.patch total: 1 errors, 1 warnings, 244 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14688439.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[BlueZ,v2,3/8] doc: document admin.allow optional controller argument
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#77:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#77:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14688436.patch total: 1 errors, 1 warnings, 43 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14688436.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[BlueZ,v2,4/8] src/adapter: enforce allowlist for local services
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#81:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#81:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14688437.patch total: 1 errors, 1 warnings, 176 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14688437.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[BlueZ,v2,5/8] plugins/admin: reapply allowlist on policy updates
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#74:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#74:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14688440.patch total: 1 errors, 1 warnings, 7 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14688440.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[BlueZ,v2,6/8] doc: describe admin allowlist runtime enforcement
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#78:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#78:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14688442.patch total: 1 errors, 1 warnings, 28 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14688442.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[BlueZ,v2,7/8] profiles/audio: fix UAF on external media service teardown
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#88:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#88:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14688443.patch total: 1 errors, 1 warnings, 52 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14688443.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[BlueZ,v2,8/8] device: apply profile-aware admin allowlist checks for device services
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#90:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#90:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14688441.patch total: 1 errors, 1 warnings, 56 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14688441.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
##############################
Test: GitLint - FAIL
Desc: Run gitlint
Output:
[BlueZ,v2,8/8] device: apply profile-aware admin allowlist checks for device services
1: T1 Title exceeds max length (85>80): "[BlueZ,v2,8/8] device: apply profile-aware admin allowlist checks for device services"
##############################
Test: BluezMake - FAIL
Desc: Build BlueZ
Output:
tools/mgmt-tester.c: In function ‘main’:
tools/mgmt-tester.c:12990:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
12990 | int main(int argc, char *argv[])
| ^~~~
unit/test-avdtp.c: In function ‘main’:
unit/test-avdtp.c:766:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
766 | int main(int argc, char *argv[])
| ^~~~
unit/test-avrcp.c: In function ‘main’:
unit/test-avrcp.c:989:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
989 | int main(int argc, char *argv[])
| ^~~~
monitor/packet.c: In function ‘print_features_subpage’:
monitor/packet.c:2940:29: error: ‘%u’ directive writing between 1 and 10 bytes into a region of size between 5 and 7 [-Werror=format-overflow=]
2940 | sprintf(str, "Features[%u/%u]", page, i);
| ^~
monitor/packet.c:2940:16: note: directive argument in the range [0, 2147483646]
2940 | sprintf(str, "Features[%u/%u]", page, i);
| ^~~~~~~~~~~~~~~~~
In file included from /usr/include/stdio.h:867,
from monitor/packet.c:18:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:36:10: note: ‘__builtin___sprintf_chk’ output between 14 and 25 bytes into a destination of size 18
36 | return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
37 | __bos (__s), __fmt, __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7058: monitor/packet.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:4172: all] Error 2
##############################
Test: MakeCheck - FAIL
Desc: Run Bluez Make Check
Output:
monitor/packet.c: In function ‘print_features_subpage’:
monitor/packet.c:2940:29: error: ‘%u’ directive writing between 1 and 10 bytes into a region of size between 5 and 7 [-Werror=format-overflow=]
2940 | sprintf(str, "Features[%u/%u]", page, i);
| ^~
monitor/packet.c:2940:16: note: directive argument in the range [0, 2147483646]
2940 | sprintf(str, "Features[%u/%u]", page, i);
| ^~~~~~~~~~~~~~~~~
In file included from /usr/include/stdio.h:867,
from monitor/packet.c:18:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:36:10: note: ‘__builtin___sprintf_chk’ output between 14 and 25 bytes into a destination of size 18
36 | return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
37 | __bos (__s), __fmt, __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7058: monitor/packet.o] Error 1
make: *** [Makefile:10820: check] Error 2
##############################
Test: CheckValgrind - FAIL
Desc: Run Bluez Make Check with Valgrind
Output:
tools/mgmt-tester.c: In function ‘main’:
tools/mgmt-tester.c:12990:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
12990 | int main(int argc, char *argv[])
| ^~~~
monitor/packet.c: In function ‘print_features_subpage’:
monitor/packet.c:2940:29: error: ‘%u’ directive writing between 1 and 10 bytes into a region of size between 5 and 7 [-Werror=format-overflow=]
2940 | sprintf(str, "Features[%u/%u]", page, i);
| ^~
monitor/packet.c:2940:16: note: directive argument in the range [0, 2147483646]
2940 | sprintf(str, "Features[%u/%u]", page, i);
| ^~~~~~~~~~~~~~~~~
In file included from /usr/include/stdio.h:867,
from monitor/packet.c:18:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:36:10: note: ‘__builtin___sprintf_chk’ output between 14 and 25 bytes into a destination of size 18
36 | return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
37 | __bos (__s), __fmt, __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7058: monitor/packet.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:10820: check] Error 2
##############################
Test: IncrementalBuild - FAIL
Desc: Incremental build with the patches in the series
Output:
tools/mgmt-tester.c: In function ‘main’:
tools/mgmt-tester.c:12990:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
12990 | int main(int argc, char *argv[])
| ^~~~
unit/test-avdtp.c: In function ‘main’:
unit/test-avdtp.c:766:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
766 | int main(int argc, char *argv[])
| ^~~~
unit/test-avrcp.c: In function ‘main’:
unit/test-avrcp.c:989:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
989 | int main(int argc, char *argv[])
| ^~~~
monitor/packet.c: In function ‘print_features_subpage’:
monitor/packet.c:2940:29: error: ‘%u’ directive writing between 1 and 10 bytes into a region of size between 5 and 7 [-Werror=format-overflow=]
2940 | sprintf(str, "Features[%u/%u]", page, i);
| ^~
monitor/packet.c:2940:16: note: directive argument in the range [0, 2147483646]
2940 | sprintf(str, "Features[%u/%u]", page, i);
| ^~~~~~~~~~~~~~~~~
In file included from /usr/include/stdio.h:867,
from monitor/packet.c:18:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:36:10: note: ‘__builtin___sprintf_chk’ output between 14 and 25 bytes into a destination of size 18
36 | return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
37 | __bos (__s), __fmt, __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7058: monitor/packet.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:4172: all] Error 2
[BlueZ,v2,1/8] plugins/admin: make AdminPolicy state per-adapter
tools/mgmt-tester.c: In function ‘main’:
tools/mgmt-tester.c:12990:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
12990 | int main(int argc, char *argv[])
| ^~~~
unit/test-avdtp.c: In function ‘main’:
unit/test-avdtp.c:766:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
766 | int main(int argc, char *argv[])
| ^~~~
unit/test-avrcp.c: In function ‘main’:
unit/test-avrcp.c:989:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
989 | int main(int argc, char *argv[])
| ^~~~
monitor/packet.c: In function ‘print_features_subpage’:
monitor/packet.c:2940:29: error: ‘%u’ directive writing between 1 and 10 bytes into a region of size between 5 and 7 [-Werror=format-overflow=]
2940 | sprintf(str, "Features[%u/%u]", page, i);
| ^~
monitor/packet.c:2940:16: note: directive argument in the range [0, 2147483646]
2940 | sprintf(str, "Features[%u/%u]", page, i);
| ^~~~~~~~~~~~~~~~~
In file included from /usr/include/stdio.h:867,
from monitor/packet.c:18:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:36:10: note: ‘__builtin___sprintf_chk’ output between 14 and 25 bytes into a destination of size 18
36 | return __builtin___sprintf_chk (__s, __USE_FORTIFY_LEVEL - 1,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
37 | __bos (__s), __fmt, __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:7058: monitor/packet.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:4172: all] Error 2
https://github.com/bluez/bluez/pull/2313
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH BlueZ v3 0/7] plugin/admin: Make allowlist adapter-scoped and enforce at runtime
@ 2026-08-19 14:43 Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 1/7] plugins/admin: make AdminPolicy state per-adapter Frédéric Danis
` (6 more replies)
0 siblings, 7 replies; 10+ messages in thread
From: Frédéric Danis @ 2026-08-19 14:43 UTC (permalink / raw)
To: linux-bluetooth
This series tightens AdminPolicy ServiceAllowList handling and makes
its behavior consistent across adapter selection, adapter profile
activation, local SDP service registration, and device service
allowance checks.
The first part removes global AdminPolicy state and makes policy
tracking per-adapter, which fixes D-Bus updates being emitted on the
wrong adapter and avoids cross-adapter coupling.
The second part updates bluetoothctl admin.allow to be adapter-aware:
it now targets the currently selected default adapter instead of a
single global proxy.
The core functional change is runtime enforcement of ServiceAllowList
for local adapter/server services in addition to existing remote-device
policy checks. When policy changes, adapters immediately reapply
allowlist decisions by stopping/removing disallowed services and
starting newly allowed ones, without restarting bluetoothd.
Finally, device-side and A2DP allowlist checks are made role-aware, so
that local Sink/Source role UUIDs are used consistently across
adapter profile probing, device connection filtering, and A2DP SEP
negotiation, fixing role-inverted cases and blocking disallowed roles
earlier (at Get_Capability/Set_Configuration time) instead of relying
on later teardown paths.
Summary of effects:
- AdminPolicy state is correctly scoped per adapter.
- admin.allow targets the currently selected default adapter.
- ServiceAllowList now governs both remote profiles and local
adapter/server services.
- Allowlist updates are enforced immediately on initialized adapters.
- Device, adapter, and A2DP policy decisions consistently use
role-aware UUID mapping semantics.
- Blocked A2DP roles are rejected at SEP negotiation time, avoiding
stale role state and reconnect instability across policy updates.
v1->v2: Add new commit to fix outgoing connection by unifying device-side
filtering with adapter-side profile-aware allowlist mapping semantics.
v2->v3:
- Drop the "profiles/audio: fix UAF on external media service
teardown" commit, since it has already been merged upstream
separately and is no longer part of this series.
- Drop the optional [ctrl] argument from bluetoothctl's admin.allow;
it now always targets the currently selected default adapter, which
also removed the need for the separate doc patch documenting that
argument.
- src/adapter: map both a2dp-source and a2dp-sink profile probing to
ADVANCED_AUDIO_UUID (0x110d) instead of swapped Sink/Source UUIDs,
so profile probe gating matches the A2DP profile class while local
Source/Sink SDP records still get filtered by their own UUIDs.
- device: rework device-side service allowance to use a dedicated
role-aware helper (service_policy_uuid()) mapping a2dp-sink to the
A2DP Source UUID and a2dp-source to the A2DP Sink UUID, instead of
the shared btd_adapter_is_profile_allowed() helper, fixing a false
block seen during host-initiated A2DP connect attempts.
- Add a new commit making A2DP allowlist enforcement itself role-safe:
policy is now checked at Get_Capability/Set_Configuration
negotiation time (rejecting blocked roles early), a2dp.c server
role bookkeeping was hardened (explicit source_enabled/sink_enabled
flags, cleared source/sink list heads) to avoid stale role state
across dynamic reapply, and media.c now treats endpoints skipped by
admin allowlist as non-fatal instead of logging an error.
Frédéric Danis (7):
plugins/admin: make AdminPolicy state per-adapter
client/bluetoothctl: make admin.allow controller-aware
src/adapter: enforce allowlist for local services
plugins/admin: reapply allowlist on policy updates
doc: describe admin allowlist runtime enforcement
device: unify admin allowlist checks for device services
profiles/audio: make A2DP admin allowlist enforcement role-safe
client/admin.c | 74 +++++++++++----
client/admin.h | 2 +
client/main.c | 8 ++
doc/org.bluez.AdminPolicySet.rst | 11 +++
doc/org.bluez.AdminPolicyStatus.rst | 5 +
plugins/admin.c | 131 ++++++++++++++++++++------
profiles/audio/a2dp.c | 38 +++++++-
profiles/audio/media.c | 7 ++
src/adapter.c | 141 ++++++++++++++++++++++++++++
src/adapter.h | 4 +
src/device.c | 35 ++++++-
11 files changed, 398 insertions(+), 58 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH BlueZ v3 1/7] plugins/admin: make AdminPolicy state per-adapter
2026-08-19 14:43 [PATCH BlueZ v3 0/7] plugin/admin: Make allowlist adapter-scoped and enforce at runtime Frédéric Danis
@ 2026-08-19 14:43 ` Frédéric Danis
2026-08-19 15:45 ` plugin/admin: Make allowlist adapter-scoped and enforce at runtime bluez.test.bot
2026-08-19 14:43 ` [PATCH BlueZ v3 2/7] client/bluetoothctl: make admin.allow controller-aware Frédéric Danis
` (5 subsequent siblings)
6 siblings, 1 reply; 10+ messages in thread
From: Frédéric Danis @ 2026-08-19 14:43 UTC (permalink / raw)
To: linux-bluetooth
Fix AdminPolicy D-Bus updates being emitted on the wrong adapter path
by removing the single global policy context and moving to per-adapter
policy objects.
Changes include:
- track policy contexts in a policy queue keyed by adapter pointer
- keep per-adapter device lists inside each policy context
- emit ServiceAllowList changes using the callback's adapter context
- scope device affected updates to the current adapter only
- clean up probe/remove lifecycle so adapters are registered and torn
down independently
- remove remaining global policy_data/devices coupling
Assisted-by: GPT:GPT-5.3-Codex
---
plugins/admin.c | 130 ++++++++++++++++++++++++++++++++++++------------
1 file changed, 99 insertions(+), 31 deletions(-)
diff --git a/plugins/admin.c b/plugins/admin.c
index 76c65d068..6c5c8d97f 100644
--- a/plugins/admin.c
+++ b/plugins/admin.c
@@ -39,21 +39,45 @@
#define BTD_DEVICE_INTERFACE "org.bluez.Device1"
static DBusConnection *dbus_conn;
-static struct queue *devices; /* List of struct device_data objects */
+static struct queue *policies; /* List of struct btd_admin_policy objects */
-/* |policy_data| has the same life cycle as btd_adapter */
-static struct btd_admin_policy {
+/* One policy context per adapter */
+struct btd_admin_policy {
struct btd_adapter *adapter;
uint16_t adapter_id;
struct queue *service_allowlist;
-} *policy_data = NULL;
+ struct queue *devices;
+};
struct device_data {
struct btd_device *device;
char *path;
bool affected;
+ struct btd_admin_policy *policy;
};
+static void free_device_data(void *data);
+static void unregister_device_data(void *data, void *user_data);
+
+static bool policy_match_adapter(const void *data, const void *match_data)
+{
+ const struct btd_admin_policy *policy = data;
+ const struct btd_adapter *adapter = match_data;
+
+ if (!policy)
+ return false;
+
+ return policy->adapter == adapter;
+}
+
+static struct btd_admin_policy *admin_policy_find(struct btd_adapter *adapter)
+{
+ if (!policies)
+ return NULL;
+
+ return queue_find(policies, policy_match_adapter, adapter);
+}
+
static struct btd_admin_policy *admin_policy_new(struct btd_adapter *adapter)
{
struct btd_admin_policy *admin_policy = NULL;
@@ -68,6 +92,16 @@ static struct btd_admin_policy *admin_policy_new(struct btd_adapter *adapter)
admin_policy->adapter = adapter;
admin_policy->adapter_id = btd_adapter_get_index(adapter);
admin_policy->service_allowlist = queue_new();
+ admin_policy->devices = queue_new();
+
+ if (!admin_policy->service_allowlist || !admin_policy->devices) {
+ queue_destroy(admin_policy->service_allowlist, free);
+ queue_destroy(admin_policy->devices, NULL);
+ g_free(admin_policy);
+ btd_error(btd_adapter_get_index(adapter),
+ "Failed to allocate queues for admin_policy");
+ return NULL;
+ }
return admin_policy;
}
@@ -82,6 +116,7 @@ static void admin_policy_free(void *data)
struct btd_admin_policy *admin_policy = data;
free_service_allowlist(admin_policy->service_allowlist);
+ queue_destroy(admin_policy->devices, free_device_data);
g_free(admin_policy);
}
@@ -89,6 +124,8 @@ static void admin_policy_destroy(struct btd_admin_policy *admin_policy)
{
const char *path = adapter_get_path(admin_policy->adapter);
+ queue_foreach(admin_policy->devices, unregister_device_data, NULL);
+
g_dbus_unregister_interface(dbus_conn, path,
ADMIN_POLICY_SET_INTERFACE);
g_dbus_unregister_interface(dbus_conn, path,
@@ -346,7 +383,7 @@ static void load_policy_settings(struct btd_admin_policy *admin_policy)
btd_adapter_get_storage_dir(admin_policy->adapter));
if (stat(filename, &st) < 0)
- store_policy_settings(policy_data);
+ store_policy_settings(admin_policy);
key_file = g_key_file_new();
@@ -387,11 +424,11 @@ static DBusMessage *set_service_allowlist(DBusConnection *conn,
}
g_dbus_emit_property_changed(dbus_conn,
- adapter_get_path(policy_data->adapter),
+ adapter_get_path(admin_policy->adapter),
ADMIN_POLICY_STATUS_INTERFACE,
"ServiceAllowList");
- queue_foreach(devices, update_device_affected, NULL);
+ queue_foreach(admin_policy->devices, update_device_affected, NULL);
return dbus_message_new_method_return(msg);
}
@@ -488,66 +525,86 @@ static void remove_device_data(void *data)
DBG("device_data for %s removing", device_data->path);
- queue_remove(devices, device_data);
+ if (device_data->policy)
+ queue_remove(device_data->policy->devices, device_data);
+
free_device_data(device_data);
}
static int admin_policy_adapter_probe(struct btd_adapter *adapter)
{
+ struct btd_admin_policy *policy;
const char *adapter_path;
- if (!devices)
- devices = queue_new();
+ if (!policies)
+ policies = queue_new();
- if (policy_data) {
- btd_warn(policy_data->adapter_id,
+ if (!policies)
+ return -ENOMEM;
+
+ if (admin_policy_find(adapter)) {
+ btd_warn(btd_adapter_get_index(adapter),
"Policy data already exists");
- policy_data = NULL;
+ return -EALREADY;
}
- policy_data = admin_policy_new(adapter);
- if (!policy_data)
+ policy = admin_policy_new(adapter);
+ if (!policy)
return -ENOMEM;
- load_policy_settings(policy_data);
+ load_policy_settings(policy);
adapter_path = adapter_get_path(adapter);
if (!g_dbus_register_interface(dbus_conn, adapter_path,
ADMIN_POLICY_SET_INTERFACE,
admin_policy_adapter_methods, NULL,
- NULL, policy_data, NULL)) {
- btd_error(policy_data->adapter_id,
+ NULL, policy, NULL)) {
+ btd_error(policy->adapter_id,
"Admin Policy Set interface init failed on path %s",
adapter_path);
+ admin_policy_free(policy);
return -EINVAL;
}
- btd_info(policy_data->adapter_id,
+ btd_info(policy->adapter_id,
"Admin Policy Set interface registered");
if (!g_dbus_register_interface(dbus_conn, adapter_path,
ADMIN_POLICY_STATUS_INTERFACE,
NULL, NULL,
admin_policy_adapter_properties,
- policy_data, NULL)) {
- btd_error(policy_data->adapter_id,
+ policy, NULL)) {
+ btd_error(policy->adapter_id,
"Admin Policy Status interface init failed on path %s",
adapter_path);
+ g_dbus_unregister_interface(dbus_conn, adapter_path,
+ ADMIN_POLICY_SET_INTERFACE);
+ admin_policy_free(policy);
return -EINVAL;
}
- btd_info(policy_data->adapter_id,
+ btd_info(policy->adapter_id,
"Admin Policy Status interface registered");
+ queue_push_tail(policies, policy);
+
return 0;
}
static void admin_policy_device_added(struct btd_adapter *adapter,
struct btd_device *device)
{
+ struct btd_admin_policy *policy;
struct device_data *data;
- if (queue_find(devices, device_data_match, device))
+ policy = admin_policy_find(adapter);
+ if (!policy) {
+ btd_warn(btd_adapter_get_index(adapter),
+ "Policy data not found for adapter");
+ return;
+ }
+
+ if (queue_find(policy->devices, device_data_match, device))
return;
data = g_new0(struct device_data, 1);
@@ -560,6 +617,7 @@ static void admin_policy_device_added(struct btd_adapter *adapter,
data->device = device;
data->path = g_strdup(device_get_path(device));
data->affected = !btd_device_all_services_allowed(data->device);
+ data->policy = policy;
if (!g_dbus_register_interface(dbus_conn, data->path,
ADMIN_POLICY_STATUS_INTERFACE,
@@ -573,7 +631,7 @@ static void admin_policy_device_added(struct btd_adapter *adapter,
return;
}
- queue_push_tail(devices, data);
+ queue_push_tail(policy->devices, data);
DBG("device_data for %s added", data->path);
}
@@ -589,9 +647,14 @@ static void unregister_device_data(void *data, void *user_data)
static void admin_policy_device_removed(struct btd_adapter *adapter,
struct btd_device *device)
{
+ struct btd_admin_policy *policy;
struct device_data *data;
- data = queue_find(devices, device_data_match, device);
+ policy = admin_policy_find(adapter);
+ if (!policy)
+ return;
+
+ data = queue_find(policy->devices, device_data_match, device);
if (data)
unregister_device_data(data, NULL);
@@ -599,15 +662,20 @@ static void admin_policy_device_removed(struct btd_adapter *adapter,
static void admin_policy_remove(struct btd_adapter *adapter)
{
+ struct btd_admin_policy *policy;
+
DBG("");
- queue_foreach(devices, unregister_device_data, NULL);
- queue_destroy(devices, g_free);
- devices = NULL;
+ policy = admin_policy_find(adapter);
+ if (!policy)
+ return;
+
+ queue_remove(policies, policy);
+ admin_policy_destroy(policy);
- if (policy_data) {
- admin_policy_destroy(policy_data);
- policy_data = NULL;
+ if (!queue_length(policies)) {
+ queue_destroy(policies, NULL);
+ policies = NULL;
}
}
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH BlueZ v3 2/7] client/bluetoothctl: make admin.allow controller-aware
2026-08-19 14:43 [PATCH BlueZ v3 0/7] plugin/admin: Make allowlist adapter-scoped and enforce at runtime Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 1/7] plugins/admin: make AdminPolicy state per-adapter Frédéric Danis
@ 2026-08-19 14:43 ` Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 3/7] src/adapter: enforce allowlist for local services Frédéric Danis
` (4 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Frédéric Danis @ 2026-08-19 14:43 UTC (permalink / raw)
To: linux-bluetooth
Teach admin.allow to target the selected default controller.
Replace single cached AdminPolicy proxies with per-controller proxy
lookup keyed by controller object path, so controller selection changes
are respected.
Export controller default helpers from main.c for reuse by admin.c.
Assisted-by: GPT:GPT-5.3-Codex
---
client/admin.c | 74 +++++++++++++++++++++++++++++++++++++-------------
client/admin.h | 2 ++
client/main.c | 8 ++++++
3 files changed, 65 insertions(+), 19 deletions(-)
diff --git a/client/admin.c b/client/admin.c
index dc218ed2c..a6fba2f1c 100644
--- a/client/admin.c
+++ b/client/admin.c
@@ -16,6 +16,7 @@
#include <string.h>
#include <stdlib.h>
+#include "bluetooth/bluetooth.h"
#include "gdbus/gdbus.h"
#include "src/shared/shell.h"
@@ -23,27 +24,50 @@
#define _GNU_SOURCE
static DBusConnection *dbus_conn;
-static GList *admin_proxies;
-static GDBusProxy *set_proxy;
-static GDBusProxy *status_proxy;
+static GList *set_proxies;
+static GList *status_proxies;
static void admin_menu_pre_run(const struct bt_shell_menu *menu);
-static void admin_policy_set_set_proxy(GDBusProxy *proxy)
+static GDBusProxy *admin_policy_find_proxy(GList *proxies,
+ const char *path)
{
- set_proxy = proxy;
+ GList *list;
+
+ for (list = g_list_first(proxies); list; list = g_list_next(list)) {
+ GDBusProxy *proxy = list->data;
+
+ if (!strcmp(g_dbus_proxy_get_path(proxy), path))
+ return proxy;
+ }
+
+ return NULL;
}
-static void admin_policy_set_status_proxy(GDBusProxy *proxy)
+static GDBusProxy *admin_policy_get_status_proxy(const char *controller_path)
{
- status_proxy = proxy;
+ if (!controller_path)
+ return NULL;
+
+ return admin_policy_find_proxy(status_proxies, controller_path);
}
-static void admin_policy_read_service_allowlist(DBusConnection *dbus_conn)
+static GDBusProxy *admin_policy_get_set_proxy(const char *controller_path)
+{
+ if (!controller_path)
+ return NULL;
+
+ return admin_policy_find_proxy(set_proxies, controller_path);
+}
+
+static void admin_policy_read_service_allowlist(GDBusProxy *controller)
{
DBusMessageIter iter, subiter;
+ GDBusProxy *status_proxy;
char *uuid = NULL;
+ const char *controller_path = g_dbus_proxy_get_path(controller);
+ status_proxy = admin_policy_get_status_proxy(controller_path);
if (!status_proxy || !g_dbus_proxy_get_property(status_proxy,
"ServiceAllowList", &iter)) {
bt_shell_printf("Failed to get property\n");
@@ -106,10 +130,14 @@ static void set_service_reply(DBusMessage *message, void *user_data)
return bt_shell_noninteractive_quit(EXIT_FAILURE);
}
-static void admin_policy_set_service_allowlist(int argc, char *argv[])
+static void admin_policy_set_service_allowlist(GDBusProxy *controller,
+ int argc, char *argv[])
{
struct uuid_list_data data;
+ GDBusProxy *set_proxy;
+ const char *controller_path = g_dbus_proxy_get_path(controller);
+ set_proxy = admin_policy_get_set_proxy(controller_path);
if (!set_proxy) {
bt_shell_printf("Set proxy not ready\n");
return bt_shell_noninteractive_quit(EXIT_FAILURE);
@@ -128,15 +156,23 @@ static void admin_policy_set_service_allowlist(int argc, char *argv[])
static void cmd_admin_allow(int argc, char *argv[])
{
+ GDBusProxy *controller;
+
+ controller = bluetoothctl_get_default_controller();
+ if (!controller) {
+ bt_shell_printf("No default controller available\n");
+ return bt_shell_noninteractive_quit(EXIT_FAILURE);
+ }
+
if (argc <= 1) {
- admin_policy_read_service_allowlist(dbus_conn);
+ admin_policy_read_service_allowlist(controller);
return;
}
if (strcmp(argv[1], "clear") == 0)
argc--;
- admin_policy_set_service_allowlist(argc - 1, argv + 1);
+ admin_policy_set_service_allowlist(controller, argc - 1, argv + 1);
}
static const struct bt_shell_menu admin_menu = {
@@ -151,8 +187,7 @@ static const struct bt_shell_menu admin_menu = {
static void admin_policy_status_added(GDBusProxy *proxy)
{
- admin_proxies = g_list_append(admin_proxies, proxy);
- admin_policy_set_status_proxy(proxy);
+ status_proxies = g_list_append(status_proxies, proxy);
}
static void proxy_added(GDBusProxy *proxy, void *user_data)
@@ -162,15 +197,14 @@ static void proxy_added(GDBusProxy *proxy, void *user_data)
interface = g_dbus_proxy_get_interface(proxy);
if (!strcmp(interface, "org.bluez.AdminPolicySet1"))
- admin_policy_set_set_proxy(proxy);
+ set_proxies = g_list_append(set_proxies, proxy);
else if (!strcmp(interface, "org.bluez.AdminPolicyStatus1"))
admin_policy_status_added(proxy);
}
static void admin_policy_status_removed(GDBusProxy *proxy)
{
- admin_proxies = g_list_remove(admin_proxies, proxy);
- admin_policy_set_status_proxy(NULL);
+ status_proxies = g_list_remove(status_proxies, proxy);
}
static void proxy_removed(GDBusProxy *proxy, void *user_data)
@@ -180,7 +214,7 @@ static void proxy_removed(GDBusProxy *proxy, void *user_data)
interface = g_dbus_proxy_get_interface(proxy);
if (!strcmp(interface, "org.bluez.AdminPolicySet1"))
- admin_policy_set_set_proxy(NULL);
+ set_proxies = g_list_remove(set_proxies, proxy);
else if (!strcmp(interface, "org.bluez.AdminPolicyStatus1"))
admin_policy_status_removed(proxy);
}
@@ -189,8 +223,10 @@ static GDBusClient *client;
static void disconnect_handler(DBusConnection *connection, void *user_data)
{
- g_list_free_full(admin_proxies, NULL);
- admin_proxies = NULL;
+ g_list_free_full(set_proxies, NULL);
+ set_proxies = NULL;
+ g_list_free_full(status_proxies, NULL);
+ status_proxies = NULL;
}
void admin_add_submenu(void)
diff --git a/client/admin.h b/client/admin.h
index 0047770dc..00423d9d3 100644
--- a/client/admin.h
+++ b/client/admin.h
@@ -10,3 +10,5 @@
void admin_add_submenu(void);
void admin_remove_submenu(void);
+
+GDBusProxy *bluetoothctl_get_default_controller(void);
diff --git a/client/main.c b/client/main.c
index 069e20485..95828902d 100644
--- a/client/main.c
+++ b/client/main.c
@@ -903,6 +903,14 @@ static struct adapter *find_ctrl_by_address(GList *source, const char *address)
return NULL;
}
+GDBusProxy *bluetoothctl_get_default_controller(void)
+{
+ if (!default_ctrl)
+ return NULL;
+
+ return default_ctrl->proxy;
+}
+
static GDBusProxy *find_proxies_by_iface(GList *source, const char *path,
const char *iface)
{
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH BlueZ v3 3/7] src/adapter: enforce allowlist for local services
2026-08-19 14:43 [PATCH BlueZ v3 0/7] plugin/admin: Make allowlist adapter-scoped and enforce at runtime Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 1/7] plugins/admin: make AdminPolicy state per-adapter Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 2/7] client/bluetoothctl: make admin.allow controller-aware Frédéric Danis
@ 2026-08-19 14:43 ` Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 4/7] plugins/admin: reapply allowlist on policy updates Frédéric Danis
` (3 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Frédéric Danis @ 2026-08-19 14:43 UTC (permalink / raw)
To: linux-bluetooth
Apply admin allowlist to adapter/server service startup and
registration, and reapply policy dynamically when allowlist changes.
- Gate adapter profile probe by allowlist-derived UUID policy
- Reapply active adapter profiles on allowlist updates (stop
disallowed, start newly allowed)
- Block SDP service registration when UUID is not allowed
- Reapply existing local SDP registrations at runtime by removing
services that become disallowed
- Map both a2dp-source and a2dp-sink admin policy checks to
ADVANCED_AUDIO_UUID (0x110d). This keeps A2DP profile infrastructure
enabled when the A2DP class UUID is allowed, while specific local
Audio Source/Sink records remain filtered by their own UUID allowlist
checks
Assisted-by: GPT:GPT-5.3-Codex
---
src/adapter.c | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/adapter.h | 1 +
2 files changed, 142 insertions(+)
diff --git a/src/adapter.c b/src/adapter.c
index c21b3e7fb..0cc87f649 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1359,6 +1359,7 @@ done:
int adapter_service_add(struct btd_adapter *adapter, sdp_record_t *rec)
{
+ char *svc_uuid;
int ret;
/*
@@ -1370,6 +1371,18 @@ int adapter_service_add(struct btd_adapter *adapter, sdp_record_t *rec)
DBG("%s", adapter->path);
+ svc_uuid = bt_uuid2string(&rec->svclass);
+ if (!svc_uuid)
+ return -ENOMEM;
+
+ if (!btd_adapter_is_uuid_allowed(adapter, svc_uuid)) {
+ DBG("Service %s blocked by admin allowlist", svc_uuid);
+ free(svc_uuid);
+ return -EPERM;
+ }
+
+ free(svc_uuid);
+
ret = add_record_to_server(&adapter->bdaddr, rec);
if (ret < 0)
return ret;
@@ -5335,6 +5348,72 @@ static void load_drivers(struct btd_adapter *adapter)
probe_driver(adapter, l->data);
}
+struct profile_allowlist_map {
+ const char *name;
+ const char *uuid;
+ bool use_remote_uuid;
+};
+
+/*
+ * Adapter server policy UUID defaults to local_uuid when available.
+ * Profiles listed below are exceptions.
+ *
+ * A2DP profiles map to ADVANCED_AUDIO_UUID so profile probe gating matches
+ * the A2DP profile class (0x110d), while adapter service registration/removal
+ * still filters specific Source/Sink records by their own UUIDs.
+ */
+static const struct profile_allowlist_map profile_allowlist_map[] = {
+ { "a2dp-source", ADVANCED_AUDIO_UUID, false },
+ { "a2dp-sink", ADVANCED_AUDIO_UUID, false },
+ { "audio-avrcp-target", NULL, true },
+ { "avrcp-controller", NULL, true },
+ { "vcp", NULL, true },
+ { "micp", NULL, true },
+ { "ccp", NULL, true },
+ { "gmap", NULL, true },
+ { "tmap", NULL, true },
+ { "bass", NULL, true },
+ { "bap", NULL, true },
+ { "mcp-gmcs", NULL, true },
+};
+
+static const char *profile_allowlist_uuid(const struct btd_profile *profile)
+{
+ size_t i;
+
+ if (profile->local_uuid)
+ return profile->local_uuid;
+
+ if (!profile->name)
+ return NULL;
+
+ for (i = 0; i < ARRAY_SIZE(profile_allowlist_map); i++) {
+ const struct profile_allowlist_map *entry =
+ &profile_allowlist_map[i];
+
+ if (strcmp(profile->name, entry->name))
+ continue;
+
+ if (entry->use_remote_uuid)
+ return profile->remote_uuid;
+
+ return entry->uuid;
+ }
+
+ return NULL;
+}
+
+static bool adapter_profile_is_allowed(struct btd_adapter *adapter,
+ const struct btd_profile *profile)
+{
+ const char *uuid = profile_allowlist_uuid(profile);
+
+ if (!uuid)
+ return true;
+
+ return btd_adapter_is_uuid_allowed(adapter, uuid);
+}
+
static void probe_profile(struct btd_profile *profile, void *data)
{
struct btd_adapter *adapter = data;
@@ -5343,6 +5422,11 @@ static void probe_profile(struct btd_profile *profile, void *data)
if (profile->adapter_probe == NULL)
return;
+ if (!adapter_profile_is_allowed(adapter, profile)) {
+ DBG("%s blocked by admin allowlist", profile->name);
+ return;
+ }
+
err = profile->adapter_probe(profile, adapter);
if (err < 0) {
btd_error(adapter->dev_id, "%s: %s (%d)", profile->name,
@@ -5353,6 +5437,63 @@ static void probe_profile(struct btd_profile *profile, void *data)
adapter->profiles = g_slist_prepend(adapter->profiles, profile);
}
+static void reapply_profile(struct btd_profile *profile, void *data)
+{
+ struct btd_adapter *adapter = data;
+ bool active;
+
+ if (profile->adapter_probe == NULL)
+ return;
+
+ active = g_slist_find(adapter->profiles, profile) != NULL;
+
+ if (adapter_profile_is_allowed(adapter, profile)) {
+ if (!active)
+ probe_profile(profile, adapter);
+ return;
+ }
+
+ if (!active)
+ return;
+
+ adapter->profiles = g_slist_remove(adapter->profiles, profile);
+
+ if (profile->adapter_remove)
+ profile->adapter_remove(profile, adapter);
+}
+
+static void reapply_adapter_services(struct btd_adapter *adapter)
+{
+ sdp_list_t *l;
+
+ for (l = adapter->services; l != NULL;) {
+ sdp_list_t *next = l->next;
+ sdp_record_t *rec = l->data;
+ char *svc_uuid;
+
+ svc_uuid = bt_uuid2string(&rec->svclass);
+ if (!svc_uuid) {
+ l = next;
+ continue;
+ }
+
+ if (!btd_adapter_is_uuid_allowed(adapter, svc_uuid))
+ adapter_service_remove(adapter, rec->handle);
+
+ free(svc_uuid);
+ l = next;
+ }
+}
+
+void btd_adapter_reapply_allowed_uuids(struct btd_adapter *adapter)
+{
+ if (!adapter || !adapter->initialized)
+ return;
+
+ btd_profile_foreach(reapply_profile, adapter);
+ reapply_adapter_services(adapter);
+}
+
void adapter_add_profile(struct btd_adapter *adapter, gpointer p)
{
struct btd_profile *profile = p;
diff --git a/src/adapter.h b/src/adapter.h
index a9e1bbf66..a1c887c45 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -299,6 +299,7 @@ bool btd_adapter_set_allowed_uuids(struct btd_adapter *adapter,
struct queue *uuids);
bool btd_adapter_is_uuid_allowed(struct btd_adapter *adapter,
const char *uuid_str);
+void btd_adapter_reapply_allowed_uuids(struct btd_adapter *adapter);
void btd_adapter_load_conn_param(struct btd_adapter *adapter,
const bdaddr_t *peer, uint8_t bdaddr_type,
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH BlueZ v3 4/7] plugins/admin: reapply allowlist on policy updates
2026-08-19 14:43 [PATCH BlueZ v3 0/7] plugin/admin: Make allowlist adapter-scoped and enforce at runtime Frédéric Danis
` (2 preceding siblings ...)
2026-08-19 14:43 ` [PATCH BlueZ v3 3/7] src/adapter: enforce allowlist for local services Frédéric Danis
@ 2026-08-19 14:43 ` Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 5/7] doc: describe admin allowlist runtime enforcement Frédéric Danis
` (2 subsequent siblings)
6 siblings, 0 replies; 10+ messages in thread
From: Frédéric Danis @ 2026-08-19 14:43 UTC (permalink / raw)
To: linux-bluetooth
Invoke adapter allowlist reapply after SetServiceAllowList updates
so runtime state follows policy changes immediately.
Assisted-by: GPT:GPT-5.3-Codex
---
plugins/admin.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/plugins/admin.c b/plugins/admin.c
index 6c5c8d97f..07bd0bf3d 100644
--- a/plugins/admin.c
+++ b/plugins/admin.c
@@ -203,6 +203,7 @@ static bool service_allowlist_set(struct btd_admin_policy *admin_policy,
free_service_allowlist(admin_policy->service_allowlist);
admin_policy->service_allowlist = uuid_list;
+ btd_adapter_reapply_allowed_uuids(adapter);
return true;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH BlueZ v3 5/7] doc: describe admin allowlist runtime enforcement
2026-08-19 14:43 [PATCH BlueZ v3 0/7] plugin/admin: Make allowlist adapter-scoped and enforce at runtime Frédéric Danis
` (3 preceding siblings ...)
2026-08-19 14:43 ` [PATCH BlueZ v3 4/7] plugins/admin: reapply allowlist on policy updates Frédéric Danis
@ 2026-08-19 14:43 ` Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 6/7] device: unify admin allowlist checks for device services Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 7/7] profiles/audio: make A2DP admin allowlist enforcement role-safe Frédéric Danis
6 siblings, 0 replies; 10+ messages in thread
From: Frédéric Danis @ 2026-08-19 14:43 UTC (permalink / raw)
To: linux-bluetooth
Document that ServiceAllowList now also governs local adapter/server
startup and registration, and that allowlist updates are applied
immediately on initialized adapters.
Clarify ServiceAllowList status semantics for both remote profile
connection policy and local server policy.
Assisted-by: GPT:GPT-5.3-Codex
---
doc/org.bluez.AdminPolicySet.rst | 11 +++++++++++
doc/org.bluez.AdminPolicyStatus.rst | 5 +++++
2 files changed, 16 insertions(+)
diff --git a/doc/org.bluez.AdminPolicySet.rst b/doc/org.bluez.AdminPolicySet.rst
index db132b7de..991388479 100644
--- a/doc/org.bluez.AdminPolicySet.rst
+++ b/doc/org.bluez.AdminPolicySet.rst
@@ -41,6 +41,17 @@ Sets the service allowlist by specifying service UUIDs.
When called, **bluetoothd(8)** will block incoming and outgoing connections to
the service not in UUIDs for all of the clients.
+The allowlist also applies to local adapter/server services. When an allowlist
+exists, only adapter/server services whose policy UUID is in UUIDs are started
+or registered.
+
+Updating the allowlist is applied immediately on initialized adapters:
+
+- services that become disallowed are stopped/removed
+- services that become allowed are started/registered
+
+This does not require restarting **bluetoothd(8)** or power-cycling adapters.
+
Any subsequent calls to this method will supersede any previously set allowlist
values. Calling this method with an empty array will allow any service UUIDs to
be used.
diff --git a/doc/org.bluez.AdminPolicyStatus.rst b/doc/org.bluez.AdminPolicyStatus.rst
index 702e020aa..d44ab9361 100644
--- a/doc/org.bluez.AdminPolicyStatus.rst
+++ b/doc/org.bluez.AdminPolicyStatus.rst
@@ -43,6 +43,11 @@ array{string} ServiceAllowList [readonly, adapter-only]
Current value of service allow list.
+When non-empty, this list controls both:
+
+- remote service connection policy for device profiles
+- local adapter/server service startup and registration policy
+
bool IsAffectedByPolicy [readonly, device-only]
```````````````````````````````````````````````
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH BlueZ v3 6/7] device: unify admin allowlist checks for device services
2026-08-19 14:43 [PATCH BlueZ v3 0/7] plugin/admin: Make allowlist adapter-scoped and enforce at runtime Frédéric Danis
` (4 preceding siblings ...)
2026-08-19 14:43 ` [PATCH BlueZ v3 5/7] doc: describe admin allowlist runtime enforcement Frédéric Danis
@ 2026-08-19 14:43 ` Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 7/7] profiles/audio: make A2DP admin allowlist enforcement role-safe Frédéric Danis
6 siblings, 0 replies; 10+ messages in thread
From: Frédéric Danis @ 2026-08-19 14:43 UTC (permalink / raw)
To: linux-bluetooth
Consolidate device-side admin policy handling into one coherent model so
incoming and outgoing A2DP behavior follows the configured allowlist
consistently.
Why:
- The initial profile-aware adapter mapping fixed role-inverted A2DP cases
for some paths, but device-side service gating still used mixed criteria.
- Host-initiated Connect() could evaluate A2DP services with the wrong UUID
perspective, leading to valid flows being blocked (or blocked flows being
considered valid) under partial allowlists.
What changed:
- Use direct UUID allowlist checks for device service eligibility updates.
- Add A2DP role-aware mapping for device policy UUID selection:
- a2dp-sink -> A2DP Source UUID (110a)
- a2dp-source -> A2DP Sink UUID (110b)
- Apply the same policy UUID resolution in:
- btd_device_all_services_allowed()
- btd_device_update_allowed_services()
Result:
- Device-service policy decisions now align with intended local A2DP role
semantics for both remote-initiated and host-initiated connection paths.
- Admin allowlist enforcement remains strict while eliminating the observed
false block during host->remote A2DP connect attempts.
Assisted-by: GPT:GPT-5.3-Codex
---
src/adapter.c | 6 +++---
src/adapter.h | 3 +++
src/device.c | 35 +++++++++++++++++++++++++++++++----
3 files changed, 37 insertions(+), 7 deletions(-)
diff --git a/src/adapter.c b/src/adapter.c
index 0cc87f649..138c57800 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -5403,7 +5403,7 @@ static const char *profile_allowlist_uuid(const struct btd_profile *profile)
return NULL;
}
-static bool adapter_profile_is_allowed(struct btd_adapter *adapter,
+bool btd_adapter_is_profile_allowed(struct btd_adapter *adapter,
const struct btd_profile *profile)
{
const char *uuid = profile_allowlist_uuid(profile);
@@ -5422,7 +5422,7 @@ static void probe_profile(struct btd_profile *profile, void *data)
if (profile->adapter_probe == NULL)
return;
- if (!adapter_profile_is_allowed(adapter, profile)) {
+ if (!btd_adapter_is_profile_allowed(adapter, profile)) {
DBG("%s blocked by admin allowlist", profile->name);
return;
}
@@ -5447,7 +5447,7 @@ static void reapply_profile(struct btd_profile *profile, void *data)
active = g_slist_find(adapter->profiles, profile) != NULL;
- if (adapter_profile_is_allowed(adapter, profile)) {
+ if (btd_adapter_is_profile_allowed(adapter, profile)) {
if (!active)
probe_profile(profile, adapter);
return;
diff --git a/src/adapter.h b/src/adapter.h
index a1c887c45..583168f4b 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -27,6 +27,7 @@
struct btd_adapter;
struct btd_device;
+struct btd_profile;
struct queue;
struct btd_adapter *btd_adapter_get_default(void);
@@ -299,6 +300,8 @@ bool btd_adapter_set_allowed_uuids(struct btd_adapter *adapter,
struct queue *uuids);
bool btd_adapter_is_uuid_allowed(struct btd_adapter *adapter,
const char *uuid_str);
+bool btd_adapter_is_profile_allowed(struct btd_adapter *adapter,
+ const struct btd_profile *profile);
void btd_adapter_reapply_allowed_uuids(struct btd_adapter *adapter);
void btd_adapter_load_conn_param(struct btd_adapter *adapter,
diff --git a/src/device.c b/src/device.c
index 65d84be56..c396372be 100644
--- a/src/device.c
+++ b/src/device.c
@@ -2547,21 +2547,44 @@ static struct btd_service *find_connectable_service(struct btd_device *dev,
return NULL;
}
+static const char *service_policy_uuid(const struct btd_profile *profile)
+{
+ if (!profile)
+ return NULL;
+
+ /*
+ * For A2DP device services, apply admin policy by local role UUID:
+ * - a2dp-sink profile is local source role (110a)
+ * - a2dp-source profile is local sink role (110b)
+ */
+ if (profile->name) {
+ if (!strcmp(profile->name, "a2dp-sink"))
+ return A2DP_SOURCE_UUID;
+
+ if (!strcmp(profile->name, "a2dp-source"))
+ return A2DP_SINK_UUID;
+ }
+
+ return profile->remote_uuid;
+}
+
bool btd_device_all_services_allowed(struct btd_device *dev)
{
GSList *l;
struct btd_adapter *adapter = dev->adapter;
struct btd_service *service;
struct btd_profile *profile;
+ const char *uuid;
for (l = dev->services; l != NULL; l = g_slist_next(l)) {
service = l->data;
profile = btd_service_get_profile(service);
+ uuid = service_policy_uuid(profile);
- if (!profile || !profile->auto_connect)
+ if (!profile || !profile->auto_connect || !uuid)
continue;
- if (!btd_adapter_is_uuid_allowed(adapter, profile->remote_uuid))
+ if (!btd_adapter_is_uuid_allowed(adapter, uuid))
return false;
}
@@ -2575,6 +2598,7 @@ void btd_device_update_allowed_services(struct btd_device *dev)
struct btd_profile *profile;
GSList *l;
bool is_allowed;
+ const char *uuid;
char addr[18];
/* If service discovery is ongoing, let the service discovery complete
@@ -2590,9 +2614,12 @@ void btd_device_update_allowed_services(struct btd_device *dev)
for (l = dev->services; l != NULL; l = g_slist_next(l)) {
service = l->data;
profile = btd_service_get_profile(service);
+ uuid = service_policy_uuid(profile);
+
+ if (!profile || !uuid)
+ continue;
- is_allowed = btd_adapter_is_uuid_allowed(adapter,
- profile->remote_uuid);
+ is_allowed = btd_adapter_is_uuid_allowed(adapter, uuid);
btd_service_set_allowed(service, is_allowed);
}
}
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH BlueZ v3 7/7] profiles/audio: make A2DP admin allowlist enforcement role-safe
2026-08-19 14:43 [PATCH BlueZ v3 0/7] plugin/admin: Make allowlist adapter-scoped and enforce at runtime Frédéric Danis
` (5 preceding siblings ...)
2026-08-19 14:43 ` [PATCH BlueZ v3 6/7] device: unify admin allowlist checks for device services Frédéric Danis
@ 2026-08-19 14:43 ` Frédéric Danis
6 siblings, 0 replies; 10+ messages in thread
From: Frédéric Danis @ 2026-08-19 14:43 UTC (permalink / raw)
To: linux-bluetooth
Unify audio-side allowlist enforcement so A2DP behavior remains correct
across dynamic policy updates, reconnects, and role-specific endpoint
negotiation.
Why:
- Dynamic allowlist reapply could leave stale A2DP role state and dangling
role lists, leading to invalid reuse and instability during subsequent
signaling/SEP handling.
- Policy enforcement happening late (at SetConfiguration time) allowed
blocked roles to remain visible during capability negotiation, which caused
retry/disconnect behavior until session managers were restarted.
What changed:
- Harden A2DP server role removal bookkeeping:
- clear source_enabled/sink_enabled flags on remove
- clear server->sources/server->sinks list heads after free
- unregister shared server only when both roles are disabled
- Enforce admin policy at SEP negotiation boundaries:
- add role-aware helper mapping local SEP type to policy UUID
- reject blocked roles in Get_Capability path
- reject blocked roles early in Set_Configuration path
- Keep endpoint registration resilient when partial allowlists block specific
A2DP records, so allowed endpoints continue to register.
Result:
- A2DP policy decisions are consistent with local role semantics.
- Blocked roles are filtered earlier and more predictably.
- Runtime policy transitions are stable, without requiring daemon/session
manager restarts to recover expected reconnect behavior.
Assisted-by: GPT:GPT-5.3-Codex
---
profiles/audio/a2dp.c | 38 ++++++++++++++++++++++++++++++++++----
profiles/audio/media.c | 7 +++++++
2 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c
index a4ba1dacf..0d4b8cc32 100644
--- a/profiles/audio/a2dp.c
+++ b/profiles/audio/a2dp.c
@@ -811,6 +811,20 @@ static void reverse_discover(struct avdtp *session, GSList *seps, int err,
DBG("err %d", err);
}
+static bool a2dp_sep_policy_allowed(struct avdtp *session,
+ const struct a2dp_sep *sep)
+{
+ struct btd_adapter *adapter = avdtp_get_adapter(session);
+ const char *uuid;
+
+ if (sep->type == AVDTP_SEP_TYPE_SOURCE)
+ uuid = A2DP_SOURCE_UUID;
+ else
+ uuid = A2DP_SINK_UUID;
+
+ return btd_adapter_is_uuid_allowed(adapter, uuid);
+}
+
static gboolean endpoint_setconf_ind(struct avdtp *session,
struct avdtp_local_sep *sep,
struct avdtp_stream *stream,
@@ -827,6 +841,9 @@ static gboolean endpoint_setconf_ind(struct avdtp *session,
else
DBG("Source %p: Set_Configuration_Ind", sep);
+ if (!a2dp_sep_policy_allowed(session, a2dp_sep))
+ return FALSE;
+
a2dp_stream = a2dp_stream_get(a2dp_sep, session);
if (!a2dp_stream)
return FALSE;
@@ -905,6 +922,11 @@ static gboolean endpoint_getcap_ind(struct avdtp *session,
else
DBG("Source %p: Get_Capability_Ind", sep);
+ if (!a2dp_sep_policy_allowed(session, a2dp_sep)) {
+ *err = AVDTP_BAD_ACP_SEID;
+ return FALSE;
+ }
+
*caps = NULL;
media_transport = avdtp_service_cap_new(AVDTP_MEDIA_TRANSPORT,
@@ -2858,6 +2880,7 @@ struct a2dp_sep *a2dp_add_sep(struct btd_adapter *adapter, uint8_t type,
GSList **l;
uint32_t *record_id;
sdp_record_t *record;
+ int ret;
server = find_server(servers, adapter);
if (server == NULL) {
@@ -2918,12 +2941,13 @@ struct a2dp_sep *a2dp_add_sep(struct btd_adapter *adapter, uint8_t type,
return NULL;
}
- if (adapter_service_add(server->adapter, record) < 0) {
+ ret = adapter_service_add(server->adapter, record);
+ if (ret < 0) {
error("Unable to register A2DP service record");
sdp_record_free(record);
a2dp_unregister_sep(sep);
if (err)
- *err = -EINVAL;
+ *err = ret;
return NULL;
}
@@ -3687,8 +3711,11 @@ static void a2dp_source_server_remove(struct btd_profile *p,
if (!server)
return;
+ server->source_enabled = FALSE;
+
g_slist_free_full(server->sources,
(GDestroyNotify) a2dp_unregister_sep);
+ server->sources = NULL;
if (server->source_record_id) {
adapter_service_remove(server->adapter,
@@ -3696,7 +3723,7 @@ static void a2dp_source_server_remove(struct btd_profile *p,
server->source_record_id = 0;
}
- if (server->sink_record_id)
+ if (server->sink_enabled)
return;
a2dp_server_unregister(server);
@@ -3734,14 +3761,17 @@ static void a2dp_sink_server_remove(struct btd_profile *p,
if (!server)
return;
+ server->sink_enabled = FALSE;
+
g_slist_free_full(server->sinks, (GDestroyNotify) a2dp_unregister_sep);
+ server->sinks = NULL;
if (server->sink_record_id) {
adapter_service_remove(server->adapter, server->sink_record_id);
server->sink_record_id = 0;
}
- if (server->source_record_id)
+ if (server->source_enabled)
return;
a2dp_server_unregister(server);
diff --git a/profiles/audio/media.c b/profiles/audio/media.c
index 95f9580b0..26a6d7dea 100644
--- a/profiles/audio/media.c
+++ b/profiles/audio/media.c
@@ -3175,6 +3175,13 @@ static void app_register_endpoint(void *data, void *user_data)
metadata, metadata_size,
&features, &app->err);
if (!endpoint) {
+ if (app->err == -EPERM) {
+ info("Skipping endpoint %s:%s (%s) blocked by admin allowlist",
+ app->sender, path, uuid);
+ app->err = 0;
+ return;
+ }
+
error("Unable to register endpoint %s:%s: %s", app->sender,
path, strerror(-app->err));
return;
--
2.43.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* RE: plugin/admin: Make allowlist adapter-scoped and enforce at runtime
2026-08-19 14:43 ` [PATCH BlueZ v3 1/7] plugins/admin: make AdminPolicy state per-adapter Frédéric Danis
@ 2026-08-19 15:45 ` bluez.test.bot
0 siblings, 0 replies; 10+ messages in thread
From: bluez.test.bot @ 2026-08-19 15:45 UTC (permalink / raw)
To: linux-bluetooth, frederic.danis
[-- Attachment #1: Type: text/plain, Size: 7611 bytes --]
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=1148530
---Test result---
Test Summary:
CheckPatch FAIL 3.55 seconds
GitLint PASS 2.31 seconds
BuildEll PASS 20.25 seconds
BluezMake PASS 573.96 seconds
MakeCheck PASS 19.15 seconds
MakeDistcheck PASS 156.08 seconds
CheckValgrind PASS 223.41 seconds
CheckSmatch PASS 299.38 seconds
bluezmakeextell PASS 96.93 seconds
IncrementalBuild PASS 645.06 seconds
ScanBuild PASS 886.24 seconds
Details
##############################
Test: CheckPatch - FAIL
Desc: Run checkpatch.pl script
Output:
[BlueZ,v3,1/7] plugins/admin: make AdminPolicy state per-adapter
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#84:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#84:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14757533.patch total: 1 errors, 1 warnings, 259 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14757533.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[BlueZ,v3,2/7] client/bluetoothctl: make admin.allow controller-aware
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#79:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#79:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14757534.patch total: 1 errors, 1 warnings, 170 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14757534.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[BlueZ,v3,3/7] src/adapter: enforce allowlist for local services
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#86:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#86:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14757531.patch total: 1 errors, 1 warnings, 178 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14757531.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[BlueZ,v3,4/7] plugins/admin: reapply allowlist on policy updates
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#74:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#74:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14757532.patch total: 1 errors, 1 warnings, 7 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14757532.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[BlueZ,v3,5/7] doc: describe admin allowlist runtime enforcement
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#78:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#78:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14757535.patch total: 1 errors, 1 warnings, 28 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14757535.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[BlueZ,v3,6/7] device: unify admin allowlist checks for device services
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#97:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#97:
Assisted-by: GPT:GPT-5.3-Codex
/github/workspace/src/patch/14757536.patch total: 1 errors, 1 warnings, 106 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14757536.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
[BlueZ,v3,7/7] profiles/audio: make A2DP admin allowlist enforcement role-safe
WARNING:COMMIT_LOG_LONG_LINE: Possible unwrapped commit description (prefer a maximum 75 chars per line)
#80:
blocked roles to remain visible during capability negotiation, which caused
WARNING:BAD_SIGN_OFF: Non-standard signature: Assisted-by:
#101:
Assisted-by: GPT:GPT-5.3-Codex
ERROR:BAD_SIGN_OFF: Unrecognized email address: 'GPT:GPT-5.3-Codex'
#101:
Assisted-by: GPT:GPT-5.3-Codex
WARNING:LONG_LINE_STRING: line length of 87 exceeds 80 columns
#227: FILE: profiles/audio/media.c:3179:
+ info("Skipping endpoint %s:%s (%s) blocked by admin allowlist",
/github/workspace/src/patch/14757537.patch total: 1 errors, 3 warnings, 112 lines checked
NOTE: For some of the reported defects, checkpatch may be able to
mechanically convert to the typical style using --fix or --fix-inplace.
/github/workspace/src/patch/14757537.patch has style problems, please review.
NOTE: Ignored message types: COMMIT_MESSAGE COMPLEX_MACRO CONST_STRUCT FILE_PATH_CHANGES MISSING_SIGN_OFF PREFER_PACKED SPDX_LICENSE_TAG SPLIT_STRING SSCANF_TO_KSTRTO
NOTE: If any of the errors are false positives, please report
them to the maintainer, see CHECKPATCH in MAINTAINERS.
https://github.com/bluez/bluez/pull/2414
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-08-19 15:45 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-19 14:43 [PATCH BlueZ v3 0/7] plugin/admin: Make allowlist adapter-scoped and enforce at runtime Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 1/7] plugins/admin: make AdminPolicy state per-adapter Frédéric Danis
2026-08-19 15:45 ` plugin/admin: Make allowlist adapter-scoped and enforce at runtime bluez.test.bot
2026-08-19 14:43 ` [PATCH BlueZ v3 2/7] client/bluetoothctl: make admin.allow controller-aware Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 3/7] src/adapter: enforce allowlist for local services Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 4/7] plugins/admin: reapply allowlist on policy updates Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 5/7] doc: describe admin allowlist runtime enforcement Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 6/7] device: unify admin allowlist checks for device services Frédéric Danis
2026-08-19 14:43 ` [PATCH BlueZ v3 7/7] profiles/audio: make A2DP admin allowlist enforcement role-safe Frédéric Danis
-- strict thread matches above, loose matches on Subject: below --
2026-07-15 9:01 [PATCH BlueZ v2 1/8] plugins/admin: make AdminPolicy state per-adapter Frédéric Danis
2026-07-15 10:16 ` plugin/admin: Make allowlist adapter-scoped and enforce at runtime bluez.test.bot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.