public inbox for linux-bluetooth@vger.kernel.org
 help / color / mirror / Atom feed
* RE: obexd: unregister profiles when the user is inactive
  2025-04-25 17:13 [PATCH BlueZ v2 1/5] pbap: Support calling pbap_init() after pbap_exit() Andrew Sayers
@ 2025-04-25 18:50 ` bluez.test.bot
  0 siblings, 0 replies; 16+ messages in thread
From: bluez.test.bot @ 2025-04-25 18:50 UTC (permalink / raw)
  To: linux-bluetooth, kernel.org

[-- Attachment #1: Type: text/plain, Size: 1261 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=957129

---Test result---

Test Summary:
CheckPatch                    PENDING   0.25 seconds
GitLint                       PENDING   0.25 seconds
BuildEll                      PASS      20.80 seconds
BluezMake                     PASS      2817.24 seconds
MakeCheck                     PASS      20.61 seconds
MakeDistcheck                 PASS      205.37 seconds
CheckValgrind                 PASS      282.66 seconds
CheckSmatch                   PASS      310.44 seconds
bluezmakeextell               PASS      131.19 seconds
IncrementalBuild              PENDING   0.27 seconds
ScanBuild                     PASS      933.51 seconds

Details
##############################
Test: CheckPatch - PENDING
Desc: Run checkpatch.pl script
Output:

##############################
Test: GitLint - PENDING
Desc: Run gitlint
Output:

##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:



---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 16+ messages in thread

* RE: obexd: unregister profiles when the user is inactive
  2025-04-25 19:17 [PATCH BlueZ v3 1/5] pbap: Support calling pbap_init() after pbap_exit() Andrew Sayers
@ 2025-04-25 20:40 ` bluez.test.bot
  0 siblings, 0 replies; 16+ messages in thread
From: bluez.test.bot @ 2025-04-25 20:40 UTC (permalink / raw)
  To: linux-bluetooth, kernel.org

[-- Attachment #1: Type: text/plain, Size: 1261 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=957156

---Test result---

Test Summary:
CheckPatch                    PENDING   0.19 seconds
GitLint                       PENDING   0.25 seconds
BuildEll                      PASS      20.51 seconds
BluezMake                     PASS      2720.64 seconds
MakeCheck                     PASS      20.39 seconds
MakeDistcheck                 PASS      198.41 seconds
CheckValgrind                 PASS      276.15 seconds
CheckSmatch                   PASS      303.09 seconds
bluezmakeextell               PASS      127.63 seconds
IncrementalBuild              PENDING   0.25 seconds
ScanBuild                     PASS      901.86 seconds

Details
##############################
Test: CheckPatch - PENDING
Desc: Run checkpatch.pl script
Output:

##############################
Test: GitLint - PENDING
Desc: Run gitlint
Output:

##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:



---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 16+ messages in thread

* RE: obexd: unregister profiles when the user is inactive
  2025-04-28 13:15 [PATCH BlueZ v4 1/6] pbap: Support calling pbap_init() after pbap_exit() Andrew Sayers
@ 2025-04-28 14:57 ` bluez.test.bot
  0 siblings, 0 replies; 16+ messages in thread
From: bluez.test.bot @ 2025-04-28 14:57 UTC (permalink / raw)
  To: linux-bluetooth, kernel.org

[-- Attachment #1: Type: text/plain, Size: 61119 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=957730

---Test result---

Test Summary:
CheckPatch                    PENDING   0.28 seconds
GitLint                       PENDING   0.25 seconds
BuildEll                      PASS      20.86 seconds
BluezMake                     FAIL      2716.20 seconds
MakeCheck                     FAIL      22.38 seconds
MakeDistcheck                 PASS      200.85 seconds
CheckValgrind                 FAIL      196.06 seconds
CheckSmatch                   FAIL      299.55 seconds
bluezmakeextell               FAIL      125.48 seconds
IncrementalBuild              PENDING   0.55 seconds
ScanBuild                     FAIL      450.53 seconds

Details
##############################
Test: CheckPatch - PENDING
Desc: Run checkpatch.pl script
Output:

##############################
Test: GitLint - PENDING
Desc: Run gitlint
Output:

##############################
Test: BluezMake - FAIL
Desc: Build BlueZ
Output:

tools/mgmt-tester.c: In function ‘main’:
tools/mgmt-tester.c:12907:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
12907 | 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[])
      |     ^~~~
obexd/src/logind.c: In function ‘update’:
obexd/src/logind.c:64:2: error: implicit declaration of function ‘free’ [-Werror=implicit-function-declaration]
   64 |  free(state);
      |  ^~~~
obexd/src/logind.c:64:2: error: incompatible implicit declaration of built-in function ‘free’ [-Werror]
obexd/src/logind.c:26:1: note: include ‘<stdlib.h>’ or provide a declaration of ‘free’
   25 | #include "obexd/src/logind.h"
  +++ |+#include <stdlib.h>
   26 | 
cc1: all warnings being treated as errors
make[1]: *** [Makefile:9776: obexd/src/obexd-logind.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:4690: all] Error 2
##############################
Test: MakeCheck - FAIL
Desc: Run Bluez Make Check
Output:

obexd/src/logind.c: In function ‘update’:
obexd/src/logind.c:64:2: error: implicit declaration of function ‘free’ [-Werror=implicit-function-declaration]
   64 |  free(state);
      |  ^~~~
obexd/src/logind.c:64:2: error: incompatible implicit declaration of built-in function ‘free’ [-Werror]
obexd/src/logind.c:26:1: note: include ‘<stdlib.h>’ or provide a declaration of ‘free’
   25 | #include "obexd/src/logind.h"
  +++ |+#include <stdlib.h>
   26 | 
cc1: all warnings being treated as errors
make[1]: *** [Makefile:9776: obexd/src/obexd-logind.o] Error 1
make: *** [Makefile:12345: 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:12907:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
12907 | int main(int argc, char *argv[])
      |     ^~~~
obexd/src/logind.c: In function ‘update’:
obexd/src/logind.c:64:2: error: implicit declaration of function ‘free’ [-Werror=implicit-function-declaration]
   64 |  free(state);
      |  ^~~~
obexd/src/logind.c:64:2: error: incompatible implicit declaration of built-in function ‘free’ [-Werror]
obexd/src/logind.c:26:1: note: include ‘<stdlib.h>’ or provide a declaration of ‘free’
   25 | #include "obexd/src/logind.h"
  +++ |+#include <stdlib.h>
   26 | 
cc1: all warnings being treated as errors
make[1]: *** [Makefile:9776: obexd/src/obexd-logind.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:12345: check] Error 2
##############################
Test: CheckSmatch - FAIL
Desc: Run smatch tool with source
Output:

src/shared/crypto.c:271:21: warning: Variable length array is used.
src/shared/crypto.c:272:23: warning: Variable length array is used.
src/shared/gatt-helpers.c:768:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:830:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:1323:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:1354:23: warning: Variable length array is used.
src/shared/gatt-server.c:278:25: warning: Variable length array is used.
src/shared/gatt-server.c:618:25: warning: Variable length array is used.
src/shared/gatt-server.c:716:25: warning: Variable length array is used.
src/shared/bap.c:315:25: warning: array of flexible structures
src/shared/bap.c: note: in included file:
./src/shared/ascs.h:88:25: warning: array of flexible structures
src/shared/shell.c: note: in included file (through /usr/include/readline/readline.h):
/usr/include/readline/rltypedefs.h:35:23: warning: non-ANSI function declaration of function 'Function'
/usr/include/readline/rltypedefs.h:36:25: warning: non-ANSI function declaration of function 'VFunction'
/usr/include/readline/rltypedefs.h:37:27: warning: non-ANSI function declaration of function 'CPFunction'
/usr/include/readline/rltypedefs.h:38:29: warning: non-ANSI function declaration of function 'CPPFunction'
src/shared/crypto.c:271:21: warning: Variable length array is used.
src/shared/crypto.c:272:23: warning: Variable length array is used.
src/shared/gatt-helpers.c:768:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:830:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:1323:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:1354:23: warning: Variable length array is used.
src/shared/gatt-server.c:278:25: warning: Variable length array is used.
src/shared/gatt-server.c:618:25: warning: Variable length array is used.
src/shared/gatt-server.c:716:25: warning: Variable length array is used.
src/shared/bap.c:315:25: warning: array of flexible structures
src/shared/bap.c: note: in included file:
./src/shared/ascs.h:88:25: warning: array of flexible structures
src/shared/shell.c: note: in included file (through /usr/include/readline/readline.h):
/usr/include/readline/rltypedefs.h:35:23: warning: non-ANSI function declaration of function 'Function'
/usr/include/readline/rltypedefs.h:36:25: warning: non-ANSI function declaration of function 'VFunction'
/usr/include/readline/rltypedefs.h:37:27: warning: non-ANSI function declaration of function 'CPFunction'
/usr/include/readline/rltypedefs.h:38:29: warning: non-ANSI function declaration of function 'CPPFunction'
tools/mesh-cfgtest.c:1453:17: warning: unknown escape sequence: '\%'
tools/sco-tester.c: note: in included file:
./lib/bluetooth.h:232:15: warning: array of flexible structures
./lib/bluetooth.h:237:31: warning: array of flexible structures
tools/bneptest.c:634:39: warning: unknown escape sequence: '\%'
tools/seq2bseq.c:57:26: warning: Variable length array is used.
tools/obex-client-tool.c: note: in included file (through /usr/include/readline/readline.h):
/usr/include/readline/rltypedefs.h:35:23: warning: non-ANSI function declaration of function 'Function'
/usr/include/readline/rltypedefs.h:36:25: warning: non-ANSI function declaration of function 'VFunction'
/usr/include/readline/rltypedefs.h:37:27: warning: non-ANSI function declaration of function 'CPFunction'
/usr/include/readline/rltypedefs.h:38:29: warning: non-ANSI function declaration of function 'CPPFunction'
android/avctp.c:505:34: warning: Variable length array is used.
android/avctp.c:556:34: warning: Variable length array is used.
unit/test-avrcp.c:373:26: warning: Variable length array is used.
unit/test-avrcp.c:398:26: warning: Variable length array is used.
unit/test-avrcp.c:414:24: warning: Variable length array is used.
android/avrcp-lib.c:1085:34: warning: Variable length array is used.
android/avrcp-lib.c:1583:34: warning: Variable length array is used.
android/avrcp-lib.c:1612:34: warning: Variable length array is used.
android/avrcp-lib.c:1638:34: warning: Variable length array is used.
mesh/mesh-io-mgmt.c:524:67: warning: Variable length array is used.
client/display.c: note: in included file (through /usr/include/readline/readline.h):
/usr/include/readline/rltypedefs.h:35:23: warning: non-ANSI function declaration of function 'Function'
/usr/include/readline/rltypedefs.h:36:25: warning: non-ANSI function declaration of function 'VFunction'
/usr/include/readline/rltypedefs.h:37:27: warning: non-ANSI function declaration of function 'CPFunction'
/usr/include/readline/rltypedefs.h:38:29: warning: non-ANSI function declaration of function 'CPPFunction'
src/shared/crypto.c:271:21: warning: Variable length array is used.
src/shared/crypto.c:272:23: warning: Variable length array is used.
src/shared/gatt-helpers.c:768:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:830:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:1323:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:1354:23: warning: Variable length array is used.
src/shared/gatt-server.c:278:25: warning: Variable length array is used.
src/shared/gatt-server.c:618:25: warning: Variable length array is used.
src/shared/gatt-server.c:716:25: warning: Variable length array is used.
src/shared/bap.c:315:25: warning: array of flexible structures
src/shared/bap.c: note: in included file:
./src/shared/ascs.h:88:25: warning: array of flexible structures
src/shared/shell.c: note: in included file (through /usr/include/readline/readline.h):
/usr/include/readline/rltypedefs.h:35:23: warning: non-ANSI function declaration of function 'Function'
/usr/include/readline/rltypedefs.h:36:25: warning: non-ANSI function declaration of function 'VFunction'
/usr/include/readline/rltypedefs.h:37:27: warning: non-ANSI function declaration of function 'CPFunction'
/usr/include/readline/rltypedefs.h:38:29: warning: non-ANSI function declaration of function 'CPPFunction'
monitor/packet.c: note: in included file:
monitor/display.h:82:26: warning: Variable length array is used.
monitor/packet.c:1876:26: warning: Variable length array is used.
monitor/packet.c: note: in included file:
monitor/bt.h:3607:52: warning: array of flexible structures
monitor/bt.h:3595:40: warning: array of flexible structures
monitor/l2cap.c: note: in included file:
monitor/display.h:82:26: warning: Variable length array is used.
monitor/msft.c: note: in included file:
monitor/msft.h:88:44: warning: array of flexible structures
monitor/att.c: note: in included file:
monitor/display.h:82:26: warning: Variable length array is used.
tools/rctest.c:627:33: warning: non-ANSI function declaration of function 'automated_send_recv'
tools/hex2hcd.c:136:26: warning: Variable length array is used.
tools/meshctl.c:324:33: warning: non-ANSI function declaration of function 'forget_mesh_devices'
tools/mesh-gatt/node.c:456:39: warning: non-ANSI function declaration of function 'node_get_local_node'
tools/mesh-gatt/net.c:1239:30: warning: non-ANSI function declaration of function 'get_next_seq'
tools/mesh-gatt/net.c:2193:29: warning: non-ANSI function declaration of function 'net_get_default_ttl'
tools/mesh-gatt/net.c:2207:26: warning: non-ANSI function declaration of function 'net_get_seq_num'
tools/mesh-gatt/prov.c: note: in included file (through /usr/include/readline/readline.h):
/usr/include/readline/rltypedefs.h:35:23: warning: non-ANSI function declaration of function 'Function'
/usr/include/readline/rltypedefs.h:36:25: warning: non-ANSI function declaration of function 'VFunction'
/usr/include/readline/rltypedefs.h:37:27: warning: non-ANSI function declaration of function 'CPFunction'
/usr/include/readline/rltypedefs.h:38:29: warning: non-ANSI function declaration of function 'CPPFunction'
tools/mesh-gatt/onoff-model.c: note: in included file (through /usr/include/readline/readline.h):
/usr/include/readline/rltypedefs.h:35:23: warning: non-ANSI function declaration of function 'Function'
/usr/include/readline/rltypedefs.h:36:25: warning: non-ANSI function declaration of function 'VFunction'
/usr/include/readline/rltypedefs.h:37:27: warning: non-ANSI function declaration of function 'CPFunction'
/usr/include/readline/rltypedefs.h:38:29: warning: non-ANSI function declaration of function 'CPPFunction'
ell/log.c:431:65: warning: non-ANSI function declaration of function 'register_debug_section'
ell/log.c:439:68: warning: non-ANSI function declaration of function 'free_debug_sections'
ell/random.c:60:42: warning: non-ANSI function declaration of function 'l_getrandom_is_supported'
ell/cipher.c:660:28: warning: non-ANSI function declaration of function 'init_supported'
ell/checksum.c:382:28: warning: non-ANSI function declaration of function 'init_supported'
ell/checksum.c:444:47: warning: non-ANSI function declaration of function 'l_checksum_cmac_aes_supported'
ell/cipher.c:519:24: warning: Variable length array is used.
ell/cert-crypto.c:36:33: warning: Variable length array is used.
ell/cert-crypto.c:142:36: warning: Variable length array is used.
ell/cert-crypto.c:198:36: warning: Variable length array is used.
ell/cert-crypto.c:251:31: warning: Variable length array is used.
ell/key.c:550:25: warning: Variable length array is used.
ell/dbus-service.c:548:49: warning: non-ANSI function declaration of function '_dbus_object_tree_new'
ell/dbus-filter.c:232:46: warning: Variable length array is used.
ell/tls.c:45:25: warning: Variable length array is used.
ell/tls.c:86:22: warning: Variable length array is used.
ell/tls.c:86:46: warning: Variable length array is used.
ell/tls-suites.c:1078:25: warning: Variable length array is used.
ell/tls-suites.c:1080:34: warning: Variable length array is used.
ell/tls-suites.c:1083:41: warning: Variable length array is used.
ell/tls-suites.c:1132:41: warning: Variable length array is used.
ell/tls.c:1819:26: warning: Variable length array is used.
emulator/btdev.c:453:29: warning: Variable length array is used.
emulator/bthost.c:628:28: warning: Variable length array is used.
emulator/bthost.c:826:28: warning: Variable length array is used.
attrib/gatttool.c:235:23: warning: Variable length array is used.
attrib/interactive.c: note: in included file (through /usr/include/readline/readline.h):
/usr/include/readline/rltypedefs.h:35:23: warning: non-ANSI function declaration of function 'Function'
/usr/include/readline/rltypedefs.h:36:25: warning: non-ANSI function declaration of function 'VFunction'
/usr/include/readline/rltypedefs.h:37:27: warning: non-ANSI function declaration of function 'CPFunction'
/usr/include/readline/rltypedefs.h:38:29: warning: non-ANSI function declaration of function 'CPPFunction'
attrib/interactive.c:174:27: warning: non-ANSI function declaration of function 'disconnect_io'
attrib/interactive.c:299:23: warning: Variable length array is used.
profiles/sap/server.c: note: in included file:
profiles/sap/sap.h:77:35: warning: array of flexible structures
obexd/src/logind.c: In function ‘update’:
obexd/src/logind.c:64:2: error: implicit declaration of function ‘free’ [-Werror=implicit-function-declaration]
   64 |  free(state);
      |  ^~~~
obexd/src/logind.c:64:2: error: incompatible implicit declaration of built-in function ‘free’ [-Werror]
obexd/src/logind.c:26:1: note: include ‘<stdlib.h>’ or provide a declaration of ‘free’
   25 | #include "obexd/src/logind.h"
  +++ |+#include <stdlib.h>
   26 | 
cc1: all warnings being treated as errors
make[1]: *** [Makefile:9776: obexd/src/obexd-logind.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:4690: all] Error 2
##############################
Test: bluezmakeextell - FAIL
Desc: Build Bluez with External ELL
Output:

obexd/src/logind.c: In function ‘update’:
obexd/src/logind.c:64:2: error: implicit declaration of function ‘free’ [-Werror=implicit-function-declaration]
   64 |  free(state);
      |  ^~~~
obexd/src/logind.c:64:2: error: incompatible implicit declaration of built-in function ‘free’ [-Werror]
obexd/src/logind.c:26:1: note: include ‘<stdlib.h>’ or provide a declaration of ‘free’
   25 | #include "obexd/src/logind.h"
  +++ |+#include <stdlib.h>
   26 | 
cc1: all warnings being treated as errors
make[1]: *** [Makefile:9776: obexd/src/obexd-logind.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:4690: all] Error 2
##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:

##############################
Test: ScanBuild - FAIL
Desc: Run Scan Build
Output:

src/shared/gatt-client.c:451:21: warning: Use of memory after it is freed
        gatt_db_unregister(op->client->db, op->db_id);
                           ^~~~~~~~~~
src/shared/gatt-client.c:696:2: warning: Use of memory after it is freed
        discovery_op_complete(op, false, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:996:2: warning: Use of memory after it is freed
        discovery_op_complete(op, success, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1102:2: warning: Use of memory after it is freed
        discovery_op_complete(op, success, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1296:2: warning: Use of memory after it is freed
        discovery_op_complete(op, success, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1361:2: warning: Use of memory after it is freed
        discovery_op_complete(op, success, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1636:6: warning: Use of memory after it is freed
        if (read_db_hash(op)) {
            ^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1641:2: warning: Use of memory after it is freed
        discover_all(op);
        ^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:2147:6: warning: Use of memory after it is freed
        if (read_db_hash(op)) {
            ^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:2155:8: warning: Use of memory after it is freed
                                                        discovery_op_ref(op),
                                                        ^~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:3244:2: warning: Use of memory after it is freed
        complete_write_long_op(req, success, 0, false);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:3266:2: warning: Use of memory after it is freed
        request_unref(req);
        ^~~~~~~~~~~~~~~~~~
12 warnings generated.
src/shared/bap.c:1495:8: warning: Use of memory after it is freed
        bap = bt_bap_ref_safe(bap);
              ^~~~~~~~~~~~~~~~~~~~
src/shared/bap.c:2245:20: warning: Use of memory after it is freed
        return queue_find(stream->bap->streams, NULL, stream);
                          ^~~~~~~~~~~~~~~~~~~~
2 warnings generated.
src/shared/gatt-client.c:451:21: warning: Use of memory after it is freed
        gatt_db_unregister(op->client->db, op->db_id);
                           ^~~~~~~~~~
src/shared/gatt-client.c:696:2: warning: Use of memory after it is freed
        discovery_op_complete(op, false, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:996:2: warning: Use of memory after it is freed
        discovery_op_complete(op, success, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1102:2: warning: Use of memory after it is freed
        discovery_op_complete(op, success, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1296:2: warning: Use of memory after it is freed
        discovery_op_complete(op, success, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1361:2: warning: Use of memory after it is freed
        discovery_op_complete(op, success, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1636:6: warning: Use of memory after it is freed
        if (read_db_hash(op)) {
            ^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1641:2: warning: Use of memory after it is freed
        discover_all(op);
        ^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:2147:6: warning: Use of memory after it is freed
        if (read_db_hash(op)) {
            ^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:2155:8: warning: Use of memory after it is freed
                                                        discovery_op_ref(op),
                                                        ^~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:3244:2: warning: Use of memory after it is freed
        complete_write_long_op(req, success, 0, false);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:3266:2: warning: Use of memory after it is freed
        request_unref(req);
        ^~~~~~~~~~~~~~~~~~
12 warnings generated.
tools/hciattach.c:817:7: warning: Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'
        if ((n = read_hci_event(fd, resp, 10)) < 0) {
             ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hciattach.c:865:7: warning: Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'
        if ((n = read_hci_event(fd, resp, 4)) < 0) {
             ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hciattach.c:887:8: warning: Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'
                if ((n = read_hci_event(fd, resp, 10)) < 0) {
                     ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hciattach.c:909:7: warning: Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'
        if ((n = read_hci_event(fd, resp, 4)) < 0) {
             ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hciattach.c:930:7: warning: Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'
        if ((n = read_hci_event(fd, resp, 4)) < 0) {
             ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/hciattach.c:974:7: warning: Although the value stored to 'n' is used in the enclosing expression, the value is never actually read from 'n'
        if ((n = read_hci_event(fd, resp, 6)) < 0) {
             ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
6 warnings generated.
src/shared/bap.c:1495:8: warning: Use of memory after it is freed
        bap = bt_bap_ref_safe(bap);
              ^~~~~~~~~~~~~~~~~~~~
src/shared/bap.c:2245:20: warning: Use of memory after it is freed
        return queue_find(stream->bap->streams, NULL, stream);
                          ^~~~~~~~~~~~~~~~~~~~
2 warnings generated.
src/oui.c:50:2: warning: Value stored to 'hwdb' is never read
        hwdb = udev_hwdb_unref(hwdb);
        ^      ~~~~~~~~~~~~~~~~~~~~~
src/oui.c:53:2: warning: Value stored to 'udev' is never read
        udev = udev_unref(udev);
        ^      ~~~~~~~~~~~~~~~~
2 warnings generated.
tools/rfcomm.c:234:3: warning: Value stored to 'i' is never read
                i = execvp(cmdargv[0], cmdargv);
                ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/rfcomm.c:234:7: warning: Null pointer passed to 1st parameter expecting 'nonnull'
                i = execvp(cmdargv[0], cmdargv);
                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/rfcomm.c:354:8: warning: Although the value stored to 'fd' is used in the enclosing expression, the value is never actually read from 'fd'
                if ((fd = open(devname, O_RDONLY | O_NOCTTY)) < 0) {
                     ^    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/rfcomm.c:497:14: warning: Assigned value is garbage or undefined
        req.channel = raddr.rc_channel;
                    ^ ~~~~~~~~~~~~~~~~
tools/rfcomm.c:515:8: warning: Although the value stored to 'fd' is used in the enclosing expression, the value is never actually read from 'fd'
                if ((fd = open(devname, O_RDONLY | O_NOCTTY)) < 0) {
                     ^    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 warnings generated.
tools/hcidump.c:180:9: warning: Potential leak of memory pointed to by 'dp'
                                if (fds[i].fd == sock)
                                    ^~~
tools/hcidump.c:248:17: warning: Assigned value is garbage or undefined
                                dh->ts_sec  = htobl(frm.ts.tv_sec);
                                            ^ ~~~~~~~~~~~~~~~~~~~~
tools/hcidump.c:326:9: warning: 1st function call argument is an uninitialized value
                                if (be32toh(dp.flags) & 0x02) {
                                    ^~~~~~~~~~~~~~~~~
/usr/include/endian.h:46:22: note: expanded from macro 'be32toh'
#  define be32toh(x) __bswap_32 (x)
                     ^~~~~~~~~~~~~~
tools/hcidump.c:341:20: warning: 1st function call argument is an uninitialized value
                                frm.data_len = be32toh(dp.len);
                                               ^~~~~~~~~~~~~~~
/usr/include/endian.h:46:22: note: expanded from macro 'be32toh'
#  define be32toh(x) __bswap_32 (x)
                     ^~~~~~~~~~~~~~
tools/hcidump.c:346:14: warning: 1st function call argument is an uninitialized value
                                opcode = be32toh(dp.flags) & 0xffff;
                                         ^~~~~~~~~~~~~~~~~
/usr/include/endian.h:46:22: note: expanded from macro 'be32toh'
#  define be32toh(x) __bswap_32 (x)
                     ^~~~~~~~~~~~~~
tools/hcidump.c:384:17: warning: Assigned value is garbage or undefined
                        frm.data_len = btohs(dh.len);
                                     ^ ~~~~~~~~~~~~~
tools/hcidump.c:394:11: warning: Assigned value is garbage or undefined
                frm.len = frm.data_len;
                        ^ ~~~~~~~~~~~~
tools/hcidump.c:398:9: warning: 1st function call argument is an uninitialized value
                        ts = be64toh(ph.ts);
                             ^~~~~~~~~~~~~~
/usr/include/endian.h:51:22: note: expanded from macro 'be64toh'
#  define be64toh(x) __bswap_64 (x)
                     ^~~~~~~~~~~~~~
tools/hcidump.c:403:13: warning: 1st function call argument is an uninitialized value
                        frm.in = be32toh(dp.flags) & 0x01;
                                 ^~~~~~~~~~~~~~~~~
/usr/include/endian.h:46:22: note: expanded from macro 'be32toh'
#  define be32toh(x) __bswap_32 (x)
                     ^~~~~~~~~~~~~~
tools/hcidump.c:408:11: warning: Assigned value is garbage or undefined
                        frm.in = dh.in;
                               ^ ~~~~~
tools/hcidump.c:437:7: warning: Null pointer passed to 1st parameter expecting 'nonnull'
        fd = open(file, open_flags, 0644);
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
11 warnings generated.
tools/ciptool.c:350:7: warning: 5th function call argument is an uninitialized value
        sk = do_connect(ctl, dev_id, &src, &dst, psm, (1 << CMTP_LOOPBACK));
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
src/sdp-xml.c:126:10: warning: Assigned value is garbage or undefined
                buf[1] = data[i + 1];
                       ^ ~~~~~~~~~~~
src/sdp-xml.c:300:11: warning: Assigned value is garbage or undefined
                        buf[1] = data[i + 1];
                               ^ ~~~~~~~~~~~
src/sdp-xml.c:338:11: warning: Assigned value is garbage or undefined
                        buf[1] = data[i + 1];
                               ^ ~~~~~~~~~~~
3 warnings generated.
tools/sdptool.c:941:26: warning: Result of 'malloc' is converted to a pointer of type 'uint32_t', which is incompatible with sizeof operand type 'int'
                        uint32_t *value_int = malloc(sizeof(int));
                        ~~~~~~~~~~            ^~~~~~ ~~~~~~~~~~~
tools/sdptool.c:980:4: warning: 1st function call argument is an uninitialized value
                        free(allocArray[i]);
                        ^~~~~~~~~~~~~~~~~~~
tools/sdptool.c:3777:2: warning: Potential leak of memory pointed to by 'si.name'
        return add_service(0, &si);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~
tools/sdptool.c:4112:4: warning: Potential leak of memory pointed to by 'context.svc'
                        return -1;
                        ^~~~~~~~~
4 warnings generated.
tools/avtest.c:243:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 3);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:253:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 4);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:262:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 3);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:276:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf,
                                ^     ~~~~~~~~~~~~~~
tools/avtest.c:283:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf,
                                ^     ~~~~~~~~~~~~~~
tools/avtest.c:290:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf,
                                ^     ~~~~~~~~~~~~~~
tools/avtest.c:297:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf,
                                ^     ~~~~~~~~~~~~~~
tools/avtest.c:309:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 4);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:313:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 2);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:322:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 3);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:326:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 2);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:335:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 3);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:342:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 2);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:364:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 4);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:368:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 2);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:377:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 3);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:381:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 2);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:394:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 4);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:398:5: warning: Value stored to 'len' is never read
                                len = write(sk, buf, 2);
                                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:405:4: warning: Value stored to 'len' is never read
                        len = write(sk, buf, 2);
                        ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:415:4: warning: Value stored to 'len' is never read
                        len = write(sk, buf, 2);
                        ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:580:3: warning: Value stored to 'len' is never read
                len = write(sk, buf, 2);
                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:588:3: warning: Value stored to 'len' is never read
                len = write(sk, buf, invalid ? 2 : 3);
                ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/avtest.c:602:3: warning: Value stored to 'len' is never read
                len = write(sk, buf, 4 + media_transport_size);
                ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/avtest.c:615:3: warning: Value stored to 'len' is never read
                len = write(sk, buf, 3);
                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:625:3: warning: Value stored to 'len' is never read
                len = write(sk, buf, 3);
                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:637:3: warning: Value stored to 'len' is never read
                len = write(sk, buf, 3);
                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:652:3: warning: Value stored to 'len' is never read
                len = write(sk, buf, 3);
                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:664:3: warning: Value stored to 'len' is never read
                len = write(sk, buf, 3);
                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:673:3: warning: Value stored to 'len' is never read
                len = write(sk, buf, 3);
                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:680:3: warning: Value stored to 'len' is never read
                len = write(sk, buf, 2);
                ^     ~~~~~~~~~~~~~~~~~
tools/avtest.c:716:2: warning: Value stored to 'len' is never read
        len = write(sk, buf, AVCTP_HEADER_LENGTH + sizeof(play_pressed));
        ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32 warnings generated.
tools/btproxy.c:836:15: warning: Null pointer passed to 1st parameter expecting 'nonnull'
                        tcp_port = atoi(optarg);
                                   ^~~~~~~~~~~~
tools/btproxy.c:839:8: warning: Null pointer passed to 1st parameter expecting 'nonnull'
                        if (strlen(optarg) > 3 && !strncmp(optarg, "hci", 3))
                            ^~~~~~~~~~~~~~
2 warnings generated.
tools/create-image.c:76:3: warning: Value stored to 'fd' is never read
                fd = -1;
                ^    ~~
tools/create-image.c:84:3: warning: Value stored to 'fd' is never read
                fd = -1;
                ^    ~~
tools/create-image.c:92:3: warning: Value stored to 'fd' is never read
                fd = -1;
                ^    ~~
tools/create-image.c:105:2: warning: Value stored to 'fd' is never read
        fd = -1;
        ^    ~~
4 warnings generated.
tools/check-selftest.c:42:3: warning: Value stored to 'ptr' is never read
                ptr = fgets(result, sizeof(result), fp);
                ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
tools/gatt-service.c:294:2: warning: 2nd function call argument is an uninitialized value
        chr_write(chr, value, len);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
tools/btgatt-client.c:1824:2: warning: Value stored to 'argv' is never read
        argv += optind;
        ^       ~~~~~~
1 warning generated.
tools/btgatt-server.c:1212:2: warning: Value stored to 'argv' is never read
        argv -= optind;
        ^       ~~~~~~
1 warning generated.
tools/obex-server-tool.c:133:13: warning: Null pointer passed to 1st parameter expecting 'nonnull'
        data->fd = open(name, O_WRONLY | O_CREAT | O_NOCTTY, 0600);
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/obex-server-tool.c:192:13: warning: Null pointer passed to 1st parameter expecting 'nonnull'
        data->fd = open(name, O_RDONLY | O_NOCTTY, 0);
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 warnings generated.
tools/btpclientctl.c:402:3: warning: Value stored to 'bit' is never read
                bit = 0;
                ^     ~
tools/btpclientctl.c:1655:2: warning: Null pointer passed to 2nd parameter expecting 'nonnull'
        memcpy(cp->data, ad_data, ad_len);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 warnings generated.
src/sdpd-request.c:211:13: warning: Result of 'malloc' is converted to a pointer of type 'char', which is incompatible with sizeof operand type 'uint16_t'
                                pElem = malloc(sizeof(uint16_t));
                                        ^~~~~~ ~~~~~~~~~~~~~~~~
src/sdpd-request.c:239:13: warning: Result of 'malloc' is converted to a pointer of type 'char', which is incompatible with sizeof operand type 'uint32_t'
                                pElem = malloc(sizeof(uint32_t));
                                        ^~~~~~ ~~~~~~~~~~~~~~~~
2 warnings generated.
android/avrcp-lib.c:1968:3: warning: 1st function call argument is an uninitialized value
                g_free(text[i]);
                ^~~~~~~~~~~~~~~
1 warning generated.
profiles/audio/avdtp.c:896:25: warning: Use of memory after it is freed
                session->prio_queue = g_slist_remove(session->prio_queue, req);
                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
profiles/audio/avdtp.c:903:24: warning: Use of memory after it is freed
                session->req_queue = g_slist_remove(session->req_queue, req);
                                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 warnings generated.
profiles/audio/a2dp.c:371:8: warning: Use of memory after it is freed
                if (!cb->resume_cb)
                     ^~~~~~~~~~~~~
1 warning generated.
profiles/audio/avrcp.c:1961:2: warning: Value stored to 'operands' is never read
        operands += sizeof(*pdu);
        ^           ~~~~~~~~~~~~
1 warning generated.
profiles/health/hdp.c:644:3: warning: Use of memory after it is freed
                hdp_tmp_dc_data_unref(dc_data);
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
profiles/health/hdp.c:800:19: warning: Use of memory after it is freed
                path = g_strdup(chan->path);
                                ^~~~~~~~~~
profiles/health/hdp.c:1779:6: warning: Use of memory after it is freed
                                        hdp_tmp_dc_data_ref(hdp_conn),
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
profiles/health/hdp.c:1836:30: warning: Use of memory after it is freed
        reply = g_dbus_create_error(data->msg, ERROR_INTERFACE ".HealthError",
                                    ^~~~~~~~~
4 warnings generated.
profiles/health/hdp_util.c:1052:2: warning: Use of memory after it is freed
        conn_data->func(conn_data->data, gerr);
        ^~~~~~~~~~~~~~~
1 warning generated.
attrib/gatt.c:970:2: warning: Potential leak of memory pointed to by 'long_write'
        return prepare_write(long_write);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
src/sdpd-request.c:211:13: warning: Result of 'malloc' is converted to a pointer of type 'char', which is incompatible with sizeof operand type 'uint16_t'
                                pElem = malloc(sizeof(uint16_t));
                                        ^~~~~~ ~~~~~~~~~~~~~~~~
src/sdpd-request.c:239:13: warning: Result of 'malloc' is converted to a pointer of type 'char', which is incompatible with sizeof operand type 'uint32_t'
                                pElem = malloc(sizeof(uint32_t));
                                        ^~~~~~ ~~~~~~~~~~~~~~~~
2 warnings generated.
src/sdp-client.c:353:14: warning: Access to field 'cb' results in a dereference of a null pointer
        (*ctxt)->cb = cb;
        ~~~~~~~~~~~~^~~~
1 warning generated.
src/sdp-xml.c:126:10: warning: Assigned value is garbage or undefined
                buf[1] = data[i + 1];
                       ^ ~~~~~~~~~~~
src/sdp-xml.c:300:11: warning: Assigned value is garbage or undefined
                        buf[1] = data[i + 1];
                               ^ ~~~~~~~~~~~
src/sdp-xml.c:338:11: warning: Assigned value is garbage or undefined
                        buf[1] = data[i + 1];
                               ^ ~~~~~~~~~~~
3 warnings generated.
src/gatt-database.c:1173:10: warning: Value stored to 'bits' during its initialization is never read
        uint8_t bits[] = { BT_GATT_CHRC_CLI_FEAT_ROBUST_CACHING,
                ^~~~     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
gobex/gobex-transfer.c:423:7: warning: Use of memory after it is freed
        if (!g_slist_find(transfers, transfer))
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
gobex/gobex-header.c:95:2: warning: Null pointer passed to 2nd parameter expecting 'nonnull'
        memcpy(to, from, count);
        ^~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
mesh/main.c:162:3: warning: Value stored to 'optarg' is never read
                optarg += strlen("auto");
                ^         ~~~~~~~~~~~~~~
1 warning generated.
lib/hci.c:97:4: warning: Value stored to 'ptr' is never read
                        ptr += sprintf(ptr, "%s", m->str);
                        ^      ~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
client/player.c:2219:8: warning: Null pointer passed to 2nd parameter expecting 'nonnull'
                if (!strcmp(ep->path, pattern))
                     ^~~~~~~~~~~~~~~~~~~~~~~~~
client/player.c:3489:16: warning: Null pointer passed to 1st parameter expecting 'nonnull'
        codec->name = strdup(name);
                      ^~~~~~~~~~~~
2 warnings generated.
gdbus/watch.c:226:3: warning: Attempt to free released memory
                g_free(l->data);
                ^~~~~~~~~~~~~~~
1 warning generated.
lib/sdp.c:509:17: warning: Dereference of undefined pointer value
                uint8_t dtd = *(uint8_t *) dtds[i];
                              ^~~~~~~~~~~~~~~~~~~~
lib/sdp.c:539:17: warning: Dereference of undefined pointer value
                uint8_t dtd = *(uint8_t *) dtds[i];
                              ^~~~~~~~~~~~~~~~~~~~
lib/sdp.c:1885:26: warning: Potential leak of memory pointed to by 'ap'
        for (; pdlist; pdlist = pdlist->next) {
                                ^~~~~~
lib/sdp.c:1899:6: warning: Potential leak of memory pointed to by 'pds'
                ap = sdp_list_append(ap, pds);
                ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
lib/sdp.c:1944:10: warning: Potential leak of memory pointed to by 'u'
                        *seqp = sdp_list_append(*seqp, u);
                        ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/sdp.c:2049:4: warning: Potential leak of memory pointed to by 'lang'
                        sdp_list_free(*langSeq, free);
                        ^~~~~~~~~~~~~
lib/sdp.c:2138:9: warning: Potential leak of memory pointed to by 'profDesc'
        return 0;
               ^
lib/sdp.c:3270:8: warning: Potential leak of memory pointed to by 'pSvcRec'
                pSeq = sdp_list_append(pSeq, pSvcRec);
                ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/sdp.c:3271:9: warning: Potential leak of memory pointed to by 'pSeq'
                pdata += sizeof(uint32_t);
                ~~~~~~^~~~~~~~~~~~~~~~~~~
lib/sdp.c:4607:13: warning: Potential leak of memory pointed to by 'rec_list'
                        } while (scanned < attr_list_len && pdata_len > 0);
                                 ^~~~~~~
lib/sdp.c:4903:40: warning: Potential leak of memory pointed to by 'tseq'
        for (d = sdpdata->val.dataseq; d; d = d->next) {
                                              ^
lib/sdp.c:4939:8: warning: Potential leak of memory pointed to by 'subseq'
                tseq = sdp_list_append(tseq, subseq);
                ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12 warnings generated.
src/shared/gatt-client.c:451:21: warning: Use of memory after it is freed
        gatt_db_unregister(op->client->db, op->db_id);
                           ^~~~~~~~~~
src/shared/gatt-client.c:696:2: warning: Use of memory after it is freed
        discovery_op_complete(op, false, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:996:2: warning: Use of memory after it is freed
        discovery_op_complete(op, success, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1102:2: warning: Use of memory after it is freed
        discovery_op_complete(op, success, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1296:2: warning: Use of memory after it is freed
        discovery_op_complete(op, success, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1361:2: warning: Use of memory after it is freed
        discovery_op_complete(op, success, att_ecode);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1636:6: warning: Use of memory after it is freed
        if (read_db_hash(op)) {
            ^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:1641:2: warning: Use of memory after it is freed
        discover_all(op);
        ^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:2147:6: warning: Use of memory after it is freed
        if (read_db_hash(op)) {
            ^~~~~~~~~~~~~~~~
src/shared/gatt-client.c:2155:8: warning: Use of memory after it is freed
                                                        discovery_op_ref(op),
                                                        ^~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:3244:2: warning: Use of memory after it is freed
        complete_write_long_op(req, success, 0, false);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/shared/gatt-client.c:3266:2: warning: Use of memory after it is freed
        request_unref(req);
        ^~~~~~~~~~~~~~~~~~
12 warnings generated.
src/shared/bap.c:1495:8: warning: Use of memory after it is freed
        bap = bt_bap_ref_safe(bap);
              ^~~~~~~~~~~~~~~~~~~~
src/shared/bap.c:2245:20: warning: Use of memory after it is freed
        return queue_find(stream->bap->streams, NULL, stream);
                          ^~~~~~~~~~~~~~~~~~~~
2 warnings generated.
monitor/l2cap.c:1638:4: warning: Value stored to 'data' is never read
                        data += len;
                        ^       ~~~
monitor/l2cap.c:1639:4: warning: Value stored to 'size' is never read
                        size -= len;
                        ^       ~~~
2 warnings generated.
monitor/hwdb.c:59:2: warning: Value stored to 'hwdb' is never read
        hwdb = udev_hwdb_unref(hwdb);
        ^      ~~~~~~~~~~~~~~~~~~~~~
monitor/hwdb.c:64:2: warning: Value stored to 'udev' is never read
        udev = udev_unref(udev);
        ^      ~~~~~~~~~~~~~~~~
monitor/hwdb.c:106:2: warning: Value stored to 'hwdb' is never read
        hwdb = udev_hwdb_unref(hwdb);
        ^      ~~~~~~~~~~~~~~~~~~~~~
monitor/hwdb.c:111:2: warning: Value stored to 'udev' is never read
        udev = udev_unref(udev);
        ^      ~~~~~~~~~~~~~~~~
4 warnings generated.
tools/bluemoon.c:1102:8: warning: Null pointer passed to 1st parameter expecting 'nonnull'
                        if (strlen(optarg) > 3 && !strncmp(optarg, "hci", 3))
                            ^~~~~~~~~~~~~~
1 warning generated.
tools/meshctl.c:326:19: warning: Access to field 'mesh_devices' results in a dereference of a null pointer (loaded from variable 'default_ctrl')
        g_list_free_full(default_ctrl->mesh_devices, g_free);
                         ^~~~~~~~~~~~~~~~~~~~~~~~~~
tools/meshctl.c:762:2: warning: 2nd function call argument is an uninitialized value
        bt_shell_printf("Attempting to disconnect from %s\n", addr);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/meshctl.c:1957:2: warning: Value stored to 'len' is never read
        len = len + extra + strlen("local_node.json");
        ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3 warnings generated.
In file included from tools/mesh-gatt/crypto.c:32:
./src/shared/util.h:241:9: warning: 1st function call argument is an uninitialized value
        return be32_to_cpu(get_unaligned((const uint32_t *) ptr));
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./src/shared/util.h:33:26: note: expanded from macro 'be32_to_cpu'
#define be32_to_cpu(val) bswap_32(val)
                         ^~~~~~~~~~~~~
/usr/include/byteswap.h:34:21: note: expanded from macro 'bswap_32'
#define bswap_32(x) __bswap_32 (x)
                    ^~~~~~~~~~~~~~
In file included from tools/mesh-gatt/crypto.c:32:
./src/shared/util.h:251:9: warning: 1st function call argument is an uninitialized value
        return be64_to_cpu(get_unaligned((const uint64_t *) ptr));
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./src/shared/util.h:34:26: note: expanded from macro 'be64_to_cpu'
#define be64_to_cpu(val) bswap_64(val)
                         ^~~~~~~~~~~~~
/usr/include/byteswap.h:37:21: note: expanded from macro 'bswap_64'
#define bswap_64(x) __bswap_64 (x)
                    ^~~~~~~~~~~~~~
2 warnings generated.
ell/util.c:853:8: warning: The left operand of '>' is a garbage value
        if (x > UINT8_MAX)
            ~ ^
ell/util.c:871:8: warning: The left operand of '>' is a garbage value
        if (x > UINT16_MAX)
            ~ ^
2 warnings generated.
ell/pem.c:131:8: warning: Dereference of null pointer (loaded from variable 'eol')
                        if (*eol == '\r' || *eol == '\n')
                            ^~~~
ell/pem.c:166:18: warning: Dereference of null pointer (loaded from variable 'eol')
                if (buf_len && *eol == '\r' && *buf_ptr == '\n') {
                               ^~~~
ell/pem.c:166:34: warning: Dereference of null pointer (loaded from variable 'buf_ptr')
                if (buf_len && *eol == '\r' && *buf_ptr == '\n') {
                                               ^~~~~~~~
ell/pem.c:304:11: warning: 1st function call argument is an uninitialized value
        result = pem_load_buffer(file.data, file.st.st_size,
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ell/pem.c:469:9: warning: 1st function call argument is an uninitialized value
        list = l_pem_load_certificate_list_from_data(file.data,
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 warnings generated.
ell/cert.c:644:41: warning: Access to field 'asn1_len' results in a dereference of a null pointer (loaded from variable 'cert')
        key = l_key_new(L_KEY_RSA, cert->asn1, cert->asn1_len);
                                               ^~~~~~~~~~~~~~
1 warning generated.
ell/gvariant-util.c:143:18: warning: The left operand of '>' is a garbage value
                        if (alignment > max_alignment)
                            ~~~~~~~~~ ^
ell/gvariant-util.c:456:5: warning: Dereference of null pointer
                        !children[0].fixed_size) {
                         ^~~~~~~~~~~~~~~~~~~~~~
2 warnings generated.
ell/ecc-external.c:77:11: warning: Assigned value is garbage or undefined
                dest[i] = src[i];
                        ^ ~~~~~~
ell/ecc-external.c:160:18: warning: The right operand of '-' is a garbage value
                diff = left[i] - right[i] - borrow;
                               ^ ~~~~~~~~
ell/ecc-external.c:227:14: warning: 2nd function call argument is an uninitialized value
                        product = mul_64_64(left[i], right[k - i]);
                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ell/ecc-external.c:408:9: warning: Assigned value is garbage or undefined
        tmp[1] = product[3];
               ^ ~~~~~~~~~~
ell/ecc-external.c:435:22: warning: The left operand of '&' is a garbage value
        tmp[1] = product[3] & 0xffffffff00000000ull;
                 ~~~~~~~~~~ ^
ell/ecc-external.c:483:22: warning: The left operand of '&' is a garbage value
        tmp[1] = product[5] & 0xffffffff00000000ull;
                 ~~~~~~~~~~ ^
ell/ecc-external.c:688:28: warning: The left operand of '>>' is a garbage value
                tmp[i] = (product[8 + i] >> 9) | (product[9 + i] << 55);
                          ~~~~~~~~~~~~~~ ^
7 warnings generated.
In file included from tools/parser/l2cap.c:24:
tools/parser/parser.h:121:16: warning: Dereference of null pointer
                                time_t t = f->ts.tv_sec;
                                           ^~~~~~~~~~~~
tools/parser/parser.h:127:27: warning: Dereference of null pointer
                                printf("%8lu.%06lu ", f->ts.tv_sec, f->ts.tv_usec);
                                                      ^~~~~~~~~~~~
/usr/include/x86_64-linux-gnu/bits/stdio2.h:111:42: note: expanded from macro 'printf'
  __printf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
                                         ^~~~~~~~~~~
In file included from tools/parser/l2cap.c:24:
tools/parser/parser.h:129:18: warning: Access to field 'in' results in a dereference of a null pointer (loaded from variable 'f')
                printf("%c ", (f->in ? '>' : '<'));
                               ^~~~~
/usr/include/x86_64-linux-gnu/bits/stdio2.h:111:42: note: expanded from macro 'printf'
  __printf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
                                         ^~~~~~~~~~~
3 warnings generated.
In file included from tools/parser/sdp.c:24:
tools/parser/parser.h:121:16: warning: Dereference of null pointer
                                time_t t = f->ts.tv_sec;
                                           ^~~~~~~~~~~~
tools/parser/parser.h:127:27: warning: Dereference of null pointer
                                printf("%8lu.%06lu ", f->ts.tv_sec, f->ts.tv_usec);
                                                      ^~~~~~~~~~~~
/usr/include/x86_64-linux-gnu/bits/stdio2.h:111:42: note: expanded from macro 'printf'
  __printf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
                                         ^~~~~~~~~~~
In file included from tools/parser/sdp.c:24:
tools/parser/parser.h:129:18: warning: Access to field 'in' results in a dereference of a null pointer (loaded from variable 'f')
                printf("%c ", (f->in ? '>' : '<'));
                               ^~~~~
/usr/include/x86_64-linux-gnu/bits/stdio2.h:111:42: note: expanded from macro 'printf'
  __printf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
                                         ^~~~~~~~~~~
3 warnings generated.
In file included from tools/parser/ppp.c:22:
tools/parser/parser.h:156:2: warning: Undefined or garbage value returned to caller
        return *u8_ptr;
        ^~~~~~~~~~~~~~
tools/parser/ppp.c:108:30: warning: The left operand of '&' is a garbage value
        if (*((uint8_t *) frm->ptr) & 0x80)
            ~~~~~~~~~~~~~~~~~~~~~~~ ^
2 warnings generated.
emulator/serial.c:150:2: warning: Assigned value is garbage or undefined
        enum btdev_type uninitialized_var(type);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
emulator/serial.c:150:36: warning: Value stored to 'type' during its initialization is never read
        enum btdev_type uninitialized_var(type);
                                          ^~~~
emulator/serial.c:36:30: note: expanded from macro 'uninitialized_var'
#define uninitialized_var(x) x = x
                             ^   ~
emulator/serial.c:213:2: warning: Assigned value is garbage or undefined
        enum btdev_type uninitialized_var(dev_type);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
emulator/serial.c:213:36: warning: Value stored to 'dev_type' during its initialization is never read
        enum btdev_type uninitialized_var(dev_type);
                                          ^~~~~~~~
emulator/serial.c:36:30: note: expanded from macro 'uninitialized_var'
#define uninitialized_var(x) x = x
                             ^   ~
4 warnings generated.
emulator/server.c:200:2: warning: Assigned value is garbage or undefined
        enum btdev_type uninitialized_var(type);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
emulator/server.c:200:36: warning: Value stored to 'type' during its initialization is never read
        enum btdev_type uninitialized_var(type);
                                          ^~~~
emulator/server.c:36:30: note: expanded from macro 'uninitialized_var'
#define uninitialized_var(x) x = x
                             ^   ~
2 warnings generated.
emulator/b1ee.c:258:3: warning: Potential leak of memory pointed to by 'server_port'
                int opt;
                ^~~~~~~
emulator/b1ee.c:258:3: warning: Potential leak of memory pointed to by 'sniffer_port'
                int opt;
                ^~~~~~~
emulator/b1ee.c:289:2: warning: Value stored to 'argc' is never read
        argc = argc - optind;
        ^      ~~~~~~~~~~~~~
3 warnings generated.
gobex/gobex-header.c:95:2: warning: Null pointer passed to 2nd parameter expecting 'nonnull'
        memcpy(to, from, count);
        ^~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
gobex/gobex-transfer.c:423:7: warning: Use of memory after it is freed
        if (!g_slist_find(transfers, transfer))
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
attrib/gatt.c:970:2: warning: Potential leak of memory pointed to by 'long_write'
        return prepare_write(long_write);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
emulator/btdev.c:5448:23: warning: Access to field 'le_ext_adv' results in a dereference of a null pointer (loaded from variable 'remote')
        ext_adv = queue_find(remote->le_ext_adv, match_sid,
                             ^~~~~~~~~~~~~~~~~~
1 warning generated.
tools/btpclient.c:2495:3: warning: Value stored to 'reply' is never read
                reply = l_dbus_message_new_error(ag.pending_req,
                ^       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
android/avdtp.c:756:25: warning: Use of memory after it is freed
                session->prio_queue = g_slist_remove(session->prio_queue, req);
                                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
android/avdtp.c:763:24: warning: Use of memory after it is freed
                session->req_queue = g_slist_remove(session->req_queue, req);
                                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 warnings generated.
profiles/audio/media.c:1057:7: warning: Use of memory after it is freed
                if (req->cb != pac_select_cb) {
                    ^~~~~~~
1 warning generated.
obexd/src/main.c:316:6: warning: Array access (from variable 'option_root') results in a null pointer dereference
        if (option_root[0] != '/') {
            ^~~~~~~~~~~~~~
1 warning generated.
obexd/plugins/vcard.c:701:6: warning: 2nd function call argument is an uninitialized value
        if (select_qp_encoding(format, address_fields[0], address_fields[1],
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
obexd/plugins/vcard.c:701:6: warning: 3rd function call argument is an uninitialized value
        if (select_qp_encoding(format, address_fields[0], address_fields[1],
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
obexd/plugins/vcard.c:701:6: warning: 4th function call argument is an uninitialized value
        if (select_qp_encoding(format, address_fields[0], address_fields[1],
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
obexd/plugins/vcard.c:701:6: warning: 5th function call argument is an uninitialized value
        if (select_qp_encoding(format, address_fields[0], address_fields[1],
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 warnings generated.
obexd/src/logind.c: In function ‘update’:
obexd/src/logind.c:64:2: error: implicit declaration of function ‘free’ [-Werror=implicit-function-declaration]
   64 |  free(state);
      |  ^~~~
obexd/src/logind.c:64:2: error: incompatible implicit declaration of built-in function ‘free’ [-Werror]
obexd/src/logind.c:26:1: note: include ‘<stdlib.h>’ or provide a declaration of ‘free’
   25 | #include "obexd/src/logind.h"
  +++ |+#include <stdlib.h>
   26 | 
cc1: all warnings being treated as errors
make[1]: *** [Makefile:9776: obexd/src/obexd-logind.o] Error 1
make[1]: *** Waiting for unfinished jobs....
obexd/plugins/messages-dummy.c:165:9: warning: Access to field 'next' results in a dereference of a null pointer (loaded from variable 'cur')
                cur = cur->next;
                      ^~~~~~~~~
1 warning generated.
make: *** [Makefile:4690: all] Error 2


---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 16+ messages in thread

* RE: obexd: unregister profiles when the user is inactive
  2025-04-29 14:14 [PATCH BlueZ v5 1/6] pbap: Support calling pbap_init() after pbap_exit() Andrew Sayers
@ 2025-04-29 15:51 ` bluez.test.bot
  0 siblings, 0 replies; 16+ messages in thread
From: bluez.test.bot @ 2025-04-29 15:51 UTC (permalink / raw)
  To: linux-bluetooth, kernel.org

[-- Attachment #1: Type: text/plain, Size: 1261 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=958158

---Test result---

Test Summary:
CheckPatch                    PENDING   0.30 seconds
GitLint                       PENDING   0.30 seconds
BuildEll                      PASS      20.64 seconds
BluezMake                     PASS      2678.12 seconds
MakeCheck                     PASS      20.86 seconds
MakeDistcheck                 PASS      199.06 seconds
CheckValgrind                 PASS      276.37 seconds
CheckSmatch                   PASS      306.71 seconds
bluezmakeextell               PASS      127.62 seconds
IncrementalBuild              PENDING   0.33 seconds
ScanBuild                     PASS      925.74 seconds

Details
##############################
Test: CheckPatch - PENDING
Desc: Run checkpatch.pl script
Output:

##############################
Test: GitLint - PENDING
Desc: Run gitlint
Output:

##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:



---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH BlueZ v6 0/3] obexd: unregister profiles when the user is inactive
@ 2025-04-30 13:13 Andrew Sayers
  2025-04-30 13:14 ` [PATCH BlueZ v6 1/3] obexd: Unregister " Andrew Sayers
                   ` (3 more replies)
  0 siblings, 4 replies; 16+ messages in thread
From: Andrew Sayers @ 2025-04-30 13:13 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, pav, Andrew Sayers

This is a follow-up to "obexd: only run one instance at once".
Instead of refusing to run parallel services, it unregisters
profiles when the user is inactive.  This avoids the need
for tmpfiles, and avoids issues where the user with the
obex service logs out, leaving obex disabled altogether.

Luiz previously suggested moving this to systemd, but I haven't had much
luck getting the systemd devs to accept changes, and Pauli's mention of
elogind (i.e. logind without systemd) suggests it's probably better
to avoid the dependency anyway.

I considered writing a separate D-Bus service that would notify you
when the session became (in)active, but D-Bus doesn't have particularly
strong guarantees about how long messages take to deliver, which could
lead to race conditions between instances on overloaded systems.

I also considered writing some kind of library, but there's not much
code to deduplicate, and most of it would need to be reworked for every
service that uses it.  So I wrote a gist for people to copy/paste:

https://gist.github.com/andrew-sayers/1c4a24f86a9a4c1b1e38d109f1bd1d1e

Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>
---

v1 -> v2 open/close private DBus connections instead of
           calling UnregisterProfile (thanks Pauli Virtanen)
         Add obex_setup_dbus_connection_private() (to enable the above)
         Fix CI errors
         Minor issues I missed last time...
           s/regster/register/ in e-mail subject lines
           s/login_.*_cb/logind_$1_cb/g in logind.[ch]
           remove watches on exit in pbap.c and bluetooth.c
V2 -> V3 Fix checkpatch.pl errors - thanks Luiz
           Note: false positive warning about commit #4 is still present -
           this URL can't be split or shortened without causing issues.
V3 -> V4 Fix various bugs - thanks Pauli
         Split timeout_handler() into a separate patch - see above
V4 -> V5 Add #include <stdlib.h> based on CI tests - thanks Luiz
         Update the timeout on event_handler calls (and handle a couple of
           edge cases that could have misbehaved before) - thanks Pauli
         Discuss how the API assumes poll() in the penultimate
           commit message - thanks Pauli
V5 -> V6 Remove commits that were upstreamed in v5 (thanks Luiz)
         Replace dummy macros with inline functions in logind.h
           (silences some checkpatch.pl warnings, function solution
           recommended by Luiz)

Andrew Sayers (3):
      obexd: Unregister profiles when the user is inactive
      obexd: Support sd_login_monitor_get_timeout()
      Revert "obexd: only run one instance at once"

 Makefile.obexd            |  10 ++
 obexd/client/pbap.c       |  17 ++-
 obexd/plugins/bluetooth.c |  14 ++-
 obexd/src/logind.c        | 282 ++++++++++++++++++++++++++++++++++++++++++++++
 obexd/src/logind.h        |  37 ++++++
 obexd/src/main.c          |   4 +
 obexd/src/obex.service.in |   9 --
 7 files changed, 359 insertions(+), 14 deletions(-)


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH BlueZ v6 1/3] obexd: Unregister profiles when the user is inactive
  2025-04-30 13:13 [PATCH BlueZ v6 0/3] obexd: unregister profiles when the user is inactive Andrew Sayers
@ 2025-04-30 13:14 ` Andrew Sayers
  2025-04-30 14:58   ` obexd: unregister " bluez.test.bot
  2025-05-22 14:55   ` [PATCH BlueZ v6 1/3] obexd: Unregister " Frédéric Danis
  2025-04-30 13:14 ` [PATCH BlueZ v6 2/3] obexd: Support sd_login_monitor_get_timeout() Andrew Sayers
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 16+ messages in thread
From: Andrew Sayers @ 2025-04-30 13:14 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, pav, Andrew Sayers

Obexd is usually run as a user service, and can exhibit surprising
behaviour if two users are logged in at the same time.

Unregister profiles when the user is detected to be off-seat.

It may be impossible to detect whether a user is on-seat in some cases.
For example, a version of obexd compiled with systemd support might be
run outside of a systemd environment.  Warn and leave services
registered if that happens.

Obexd can be run as a system service, in which case this check makes no
sense.  Disable this check when called with `--system-bus`.

Obexd can also be run by a user that does not have an active session.
For example, someone could use `ssh` to access the system.  There might
be a use case where someone needs Bluetooth access but can't log in with
a keyboard, or there might be a security issue with doing so.  This isn't
handled explicitly by this patch, but a future patch could add support
by calling `logind_set(FALSE)` in the same way as is currently done
with `--system-bus`.

Unregister profiles by closing private connections instead of sending
UnregisterProfile on the shared connection.  Pipewire has apparently
found the latter to cause long shutdown delays, because bluetoothd
may be shutting down and unable to handle this message.

Based in large part on the wireplumber code mentioned by Pauli Virtanen:
https://gitlab.freedesktop.org/pipewire/wireplumber/-/blob/master/modules/module-logind.c#L52

Other services are likely to need similar functionality,
so I have created a gist to demonstrate the basic technique:
https://gist.github.com/andrew-sayers/1c4a24f86a9a4c1b1e38d109f1bd1d1e

Suggested-by: Pauli Virtanen <pav@iki.fi>
Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>
---
 Makefile.obexd            |  10 ++
 obexd/client/pbap.c       |  17 ++-
 obexd/plugins/bluetooth.c |  14 ++-
 obexd/src/logind.c        | 239 ++++++++++++++++++++++++++++++++++++++
 obexd/src/logind.h        |  37 ++++++
 obexd/src/main.c          |   4 +
 6 files changed, 316 insertions(+), 5 deletions(-)
 create mode 100644 obexd/src/logind.c
 create mode 100644 obexd/src/logind.h

diff --git a/Makefile.obexd b/Makefile.obexd
index 74dd977a0..b59cfaf8f 100644
--- a/Makefile.obexd
+++ b/Makefile.obexd
@@ -67,6 +67,7 @@ obexd_src_obexd_SOURCES = $(btio_sources) $(gobex_sources) \
 			obexd/src/main.c obexd/src/obexd.h \
 			obexd/src/plugin.h obexd/src/plugin.c \
 			obexd/src/log.h obexd/src/log.c \
+			obexd/src/logind.h obexd/src/logind.c \
 			obexd/src/manager.h obexd/src/manager.c \
 			obexd/src/obex.h obexd/src/obex.c obexd/src/obex-priv.h \
 			obexd/src/mimetype.h obexd/src/mimetype.c \
@@ -96,6 +97,8 @@ obexd_src_obexd_LDADD = lib/libbluetooth-internal.la \
 
 if EXTERNAL_PLUGINS
 obexd_src_obexd_LDFLAGS = $(AM_LDFLAGS) -Wl,--export-dynamic
+else
+obexd_src_obexd_LDFLAGS =
 endif
 
 obexd_src_obexd_CPPFLAGS = $(AM_CPPFLAGS) $(GLIB_CFLAGS) $(DBUS_CFLAGS) \
@@ -109,6 +112,13 @@ obexd-add-service-symlink:
 obexd-remove-service-symlink:
 endif
 
+if OBEX
+if SYSTEMD
+obexd_src_obexd_CPPFLAGS += -DSYSTEMD
+obexd_src_obexd_LDFLAGS += -lsystemd
+endif
+endif
+
 obexd_src_obexd_SHORTNAME = obexd
 
 obexd_builtin_files = obexd/src/builtin.h $(obexd_builtin_nodist)
diff --git a/obexd/client/pbap.c b/obexd/client/pbap.c
index 90f8bdc02..51b523592 100644
--- a/obexd/client/pbap.c
+++ b/obexd/client/pbap.c
@@ -27,6 +27,7 @@
 #include "gdbus/gdbus.h"
 
 #include "obexd/src/log.h"
+#include "obexd/src/logind.h"
 #include "obexd/src/obexd.h"
 
 #include "transfer.h"
@@ -1454,13 +1455,13 @@ static struct obc_driver pbap = {
 	.remove = pbap_remove
 };
 
-int pbap_init(void)
+static int pbap_init_cb(void)
 {
 	int err;
 
 	DBG("");
 
-	conn = obex_get_dbus_connection();
+	conn = obex_setup_dbus_connection_private(NULL, NULL);
 	if (!conn)
 		return -EIO;
 
@@ -1481,7 +1482,7 @@ int pbap_init(void)
 	return 0;
 }
 
-void pbap_exit(void)
+static void pbap_exit_cb(void)
 {
 	DBG("");
 
@@ -1496,9 +1497,19 @@ void pbap_exit(void)
 	}
 
 	if (conn) {
+		dbus_connection_close(conn);
 		dbus_connection_unref(conn);
 		conn = NULL;
 	}
 
 	obc_driver_unregister(&pbap);
 }
+
+int pbap_init(void)
+{
+	return logind_register(pbap_init_cb, pbap_exit_cb);
+}
+void pbap_exit(void)
+{
+	return logind_unregister(pbap_init_cb, pbap_exit_cb);
+}
diff --git a/obexd/plugins/bluetooth.c b/obexd/plugins/bluetooth.c
index 8cf718922..7ff27a8a8 100644
--- a/obexd/plugins/bluetooth.c
+++ b/obexd/plugins/bluetooth.c
@@ -35,6 +35,7 @@
 #include "obexd/src/transport.h"
 #include "obexd/src/service.h"
 #include "obexd/src/log.h"
+#include "obexd/src/logind.h"
 
 #define BT_RX_MTU 32767
 #define BT_TX_MTU 32767
@@ -426,7 +427,7 @@ static const struct obex_transport_driver driver = {
 
 static unsigned int listener_id = 0;
 
-static int bluetooth_init(void)
+static int bluetooth_init_cb(void)
 {
 	connection = g_dbus_setup_private(DBUS_BUS_SYSTEM, NULL, NULL);
 	if (connection == NULL)
@@ -438,7 +439,7 @@ static int bluetooth_init(void)
 	return obex_transport_driver_register(&driver);
 }
 
-static void bluetooth_exit(void)
+static void bluetooth_exit_cb(void)
 {
 	GSList *l;
 
@@ -462,4 +463,13 @@ static void bluetooth_exit(void)
 	obex_transport_driver_unregister(&driver);
 }
 
+static int bluetooth_init(void)
+{
+	return logind_register(bluetooth_init_cb, bluetooth_exit_cb);
+}
+static void bluetooth_exit(void)
+{
+	return logind_unregister(bluetooth_init_cb, bluetooth_exit_cb);
+}
+
 OBEX_PLUGIN_DEFINE(bluetooth, bluetooth_init, bluetooth_exit)
diff --git a/obexd/src/logind.c b/obexd/src/logind.c
new file mode 100644
index 000000000..ff2bf3219
--- /dev/null
+++ b/obexd/src/logind.c
@@ -0,0 +1,239 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ *
+ *  Enable functionality only when the user is active
+ *
+ *  Copyright (C) 2007-2010  Marcel Holtmann <marcel@holtmann.org>
+ *
+ *
+ */
+
+#ifdef SYSTEMD
+
+#include <assert.h>
+#include <errno.h>
+#include <poll.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#include <glib.h>
+
+#include <systemd/sd-login.h>
+
+#include "obexd/src/log.h"
+#include "obexd/src/logind.h"
+
+static sd_login_monitor * monitor;
+static int uid;
+static gboolean active = FALSE;
+static gboolean monitoring_enabled = TRUE;
+static guint event_source;
+
+struct callback_pair {
+	logind_init_cb init_cb;
+	logind_exit_cb exit_cb;
+};
+
+GSList *callbacks;
+
+static void call_init_cb(gpointer data, gpointer user_data)
+{
+	int res;
+
+	res = ((struct callback_pair *)data)->init_cb();
+	if (res)
+		*(int *)user_data = res;
+}
+static void call_exit_cb(gpointer data, gpointer user_data)
+{
+	((struct callback_pair *)data)->exit_cb();
+}
+
+static int update(void)
+{
+	char *state = NULL;
+	gboolean state_is_active;
+	int res;
+
+	res = sd_login_monitor_flush(monitor);
+	if (res < 0)
+		return res;
+	res = sd_uid_get_state(uid, &state);
+	state_is_active = g_strcmp0(state, "active");
+	free(state);
+	if (res < 0)
+		return res;
+
+	if (state_is_active) {
+		if (!active)
+			return 0;
+	} else {
+		res = sd_uid_get_seats(uid, 1, NULL);
+		if (res < 0)
+			return res;
+		if (active == !!res)
+			return 0;
+	}
+	active ^= TRUE;
+	res = 0;
+	g_slist_foreach(callbacks, active ? call_init_cb : call_exit_cb, &res);
+	return res;
+}
+
+static int check_event(void)
+{
+	int res;
+
+	res = sd_login_monitor_flush(monitor);
+	if (res < 0)
+		return res;
+	if (!monitoring_enabled)
+		return 0;
+	res = update();
+	if (res < 0)
+		return res;
+
+	return 0;
+}
+
+
+static gboolean event_handler(GIOChannel *source, GIOCondition condition,
+				gpointer data)
+{
+	int res;
+
+	res = check_event();
+	if (res) {
+		error("%s: %s", __func__, strerror(-res));
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+static int logind_init(void)
+{
+	GIOChannel *channel;
+	int events;
+	int fd;
+	int res;
+
+	monitor = NULL;
+
+	DBG("");
+
+	if (!monitoring_enabled)
+		return 0;
+
+	uid = getuid();
+
+	res = sd_login_monitor_new("uid", &monitor);
+	if (res < 0) {
+		monitor = NULL;
+		goto FAIL;
+	}
+
+	// Check this after creating the monitor, in case of race conditions:
+	res = update();
+	if (res < 0)
+		goto FAIL;
+
+	events = res = sd_login_monitor_get_events(monitor);
+	if (res < 0)
+		goto FAIL;
+
+	fd = res = sd_login_monitor_get_fd(monitor);
+	if (res < 0)
+		goto FAIL;
+
+	channel = g_io_channel_unix_new(fd);
+
+	g_io_channel_set_close_on_unref(channel, TRUE);
+	g_io_channel_set_encoding(channel, NULL, NULL);
+	g_io_channel_set_buffered(channel, FALSE);
+
+	event_source = g_io_add_watch(channel, events, event_handler, NULL);
+
+	g_io_channel_unref(channel);
+
+	return check_event();
+
+FAIL:
+	sd_login_monitor_unref(monitor);
+	monitoring_enabled = FALSE;
+	active = TRUE;
+	return res;
+}
+
+static void logind_exit(void)
+{
+	if (event_source) {
+		g_source_remove(event_source);
+		event_source = 0;
+	}
+	sd_login_monitor_unref(monitor);
+}
+
+static gint find_cb(gconstpointer a, gconstpointer b)
+{
+	return ((struct callback_pair *)a)->init_cb - (logind_init_cb)b;
+}
+
+int logind_register(logind_init_cb init_cb, logind_exit_cb exit_cb)
+{
+	struct callback_pair *cbs;
+
+	if (!monitoring_enabled)
+		return init_cb();
+	if (callbacks == NULL) {
+		int res;
+
+		res = logind_init();
+		if (res) {
+			error("logind_init(): %s - login detection disabled",
+				strerror(-res));
+			return init_cb();
+		}
+	}
+	cbs = g_new(struct callback_pair, 1);
+	cbs->init_cb = init_cb;
+	cbs->exit_cb = exit_cb;
+	callbacks = g_slist_prepend(callbacks, cbs);
+	return active ? init_cb() : 0;
+}
+void logind_unregister(logind_init_cb init_cb, logind_exit_cb exit_cb)
+{
+	GSList *cb_node;
+
+	if (!monitoring_enabled)
+		return exit_cb();
+	if (active)
+		exit_cb();
+	cb_node = g_slist_find_custom(callbacks, init_cb, find_cb);
+	if (cb_node != NULL)
+		callbacks = g_slist_delete_link(callbacks, cb_node);
+	if (callbacks == NULL)
+		logind_exit();
+}
+
+int logind_set(gboolean enabled)
+{
+	int res = 0;
+
+	if (monitoring_enabled == enabled)
+		return 0;
+
+	monitoring_enabled = enabled;
+	if (enabled) {
+		active = FALSE;
+		return update();
+	}
+
+	active = TRUE;
+	g_slist_foreach(callbacks, call_exit_cb, &res);
+	return res;
+}
+
+#endif
diff --git a/obexd/src/logind.h b/obexd/src/logind.h
new file mode 100644
index 000000000..eb3ff8d7b
--- /dev/null
+++ b/obexd/src/logind.h
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ *
+ *  Enable functionality only when the user is active
+ *
+ *  Copyright (C) 2007-2010  Marcel Holtmann <marcel@holtmann.org>
+ *
+ *
+ */
+
+typedef int (*logind_init_cb)(void);
+typedef void (*logind_exit_cb)(void);
+
+#ifdef SYSTEMD
+
+int logind_register(logind_init_cb init_cb, logind_exit_cb exit_cb);
+void logind_unregister(logind_init_cb init_cb, logind_exit_cb exit_cb);
+int logind_set(gboolean enabled);
+
+#else
+
+static inline int logind_register(logind_init_cb init_cb,
+					logind_exit_cb exit_cb)
+{
+	return init_cb();
+}
+static inline void logind_unregister(logind_init_cb init_cb,
+					logind_exit_cb exit_cb)
+{
+	return exit_cb();
+}
+static inline int logind_set(gboolean enabled)
+{
+	return 0;
+}
+
+#endif
diff --git a/obexd/src/main.c b/obexd/src/main.c
index ca95a70de..df150973e 100644
--- a/obexd/src/main.c
+++ b/obexd/src/main.c
@@ -35,6 +35,7 @@
 #include "../client/manager.h"
 
 #include "log.h"
+#include "logind.h"
 #include "obexd.h"
 #include "server.h"
 
@@ -283,6 +284,9 @@ int main(int argc, char *argv[])
 
 	__obex_log_init(option_debug, option_detach);
 
+	if (option_system_bus)
+		logind_set(FALSE);
+
 	DBG("Entering main loop");
 
 	main_loop = g_main_loop_new(NULL, FALSE);
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH BlueZ v6 2/3] obexd: Support sd_login_monitor_get_timeout()
  2025-04-30 13:13 [PATCH BlueZ v6 0/3] obexd: unregister profiles when the user is inactive Andrew Sayers
  2025-04-30 13:14 ` [PATCH BlueZ v6 1/3] obexd: Unregister " Andrew Sayers
@ 2025-04-30 13:14 ` Andrew Sayers
  2025-04-30 13:14 ` [PATCH BlueZ v6 3/3] Revert "obexd: only run one instance at once" Andrew Sayers
  2025-05-01 13:50 ` [PATCH BlueZ v6 0/3] obexd: unregister profiles when the user is inactive patchwork-bot+bluetooth
  3 siblings, 0 replies; 16+ messages in thread
From: Andrew Sayers @ 2025-04-30 13:14 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, pav, Andrew Sayers

The documentation for sd_login_monitor_get_timeout() implies the API
may need to be checked after some time, even if no events have been
received via the fd.

In practice, the implementation has always returned a dummy value,
and changing it now would cause enough breakage in other projects
to make it unlikely to ever happen.

Add a handler for that case, even though it can't currently
happen in the real world.

The API assumes we call poll() directly, so in theory it could change
the timeout based on some event that doesn't trigger a callback
(e.g. sending a signal to the service).  It's hard to see how we'd
handle that without running a poll() in a separate thread,
which would be a lot of complexity for an untestable edge case.
Don't try to handle that problem.

Cc: Pauli Virtanen <pav@iki.fi>
Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>
---
 obexd/src/logind.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/obexd/src/logind.c b/obexd/src/logind.c
index ff2bf3219..a0eb62b1e 100644
--- a/obexd/src/logind.c
+++ b/obexd/src/logind.c
@@ -30,6 +30,7 @@ static int uid;
 static gboolean active = FALSE;
 static gboolean monitoring_enabled = TRUE;
 static guint event_source;
+static guint timeout_source;
 
 struct callback_pair {
 	logind_init_cb init_cb;
@@ -82,8 +83,11 @@ static int update(void)
 	return res;
 }
 
+static gboolean timeout_handler(gpointer user_data);
+
 static int check_event(void)
 {
+	uint64_t timeout_usec;
 	int res;
 
 	res = sd_login_monitor_flush(monitor);
@@ -95,6 +99,25 @@ static int check_event(void)
 	if (res < 0)
 		return res;
 
+	res = sd_login_monitor_get_timeout(monitor, &timeout_usec);
+	if (res < 0)
+		return res;
+
+	if (timeout_usec != (uint64_t)-1) {
+		uint64_t time_usec;
+		struct timespec ts;
+		guint interval;
+
+		res = clock_gettime(CLOCK_MONOTONIC, &ts);
+		if (res < 0)
+			return -errno;
+		time_usec = (uint64_t) ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
+		if (time_usec > timeout_usec)
+			return check_event();
+		interval = (timeout_usec - time_usec + 999) / 1000;
+		timeout_source = g_timeout_add(interval, timeout_handler, NULL);
+	}
+
 	return 0;
 }
 
@@ -104,6 +127,11 @@ static gboolean event_handler(GIOChannel *source, GIOCondition condition,
 {
 	int res;
 
+	if (timeout_source) {
+		g_source_remove(timeout_source);
+		timeout_source = 0;
+	}
+
 	res = check_event();
 	if (res) {
 		error("%s: %s", __func__, strerror(-res));
@@ -113,6 +141,17 @@ static gboolean event_handler(GIOChannel *source, GIOCondition condition,
 	return TRUE;
 }
 
+static gboolean timeout_handler(gpointer user_data)
+{
+	int res;
+
+	res = check_event();
+	if (res)
+		error("%s: %s", __func__, strerror(-res));
+
+	return FALSE;
+}
+
 static int logind_init(void)
 {
 	GIOChannel *channel;
@@ -173,6 +212,10 @@ static void logind_exit(void)
 		g_source_remove(event_source);
 		event_source = 0;
 	}
+	if (timeout_source) {
+		g_source_remove(timeout_source);
+		timeout_source = 0;
+	}
 	sd_login_monitor_unref(monitor);
 }
 
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [PATCH BlueZ v6 3/3] Revert "obexd: only run one instance at once"
  2025-04-30 13:13 [PATCH BlueZ v6 0/3] obexd: unregister profiles when the user is inactive Andrew Sayers
  2025-04-30 13:14 ` [PATCH BlueZ v6 1/3] obexd: Unregister " Andrew Sayers
  2025-04-30 13:14 ` [PATCH BlueZ v6 2/3] obexd: Support sd_login_monitor_get_timeout() Andrew Sayers
@ 2025-04-30 13:14 ` Andrew Sayers
  2025-05-01 13:50 ` [PATCH BlueZ v6 0/3] obexd: unregister profiles when the user is inactive patchwork-bot+bluetooth
  3 siblings, 0 replies; 16+ messages in thread
From: Andrew Sayers @ 2025-04-30 13:14 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: luiz.dentz, pav, Andrew Sayers

No longer needed now services can share resources.

This reverts commit 8d472b8758dcdd89bf13cf2fb06a8846e1f483a0.

Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>
---
 obexd/src/obex.service.in | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/obexd/src/obex.service.in b/obexd/src/obex.service.in
index f269bc513..cf4d8c985 100644
--- a/obexd/src/obex.service.in
+++ b/obexd/src/obex.service.in
@@ -1,19 +1,10 @@
 [Unit]
 Description=Bluetooth OBEX service
-# This is a user-specific service, but bluetooth is a device-specific protocol.
-# Only run one instance at a time, even if multiple users log in at once:
-ConditionPathExists=!/run/lock/bluez/obexd.lock
-ConditionUser=!@system
 
 [Service]
 Type=dbus
 BusName=org.bluez.obex
 ExecStart=@PKGLIBEXECDIR@/obexd
 
-# If the service fails on the following line, please ensure
-# the bluez tmpfile has been installed in /usr/lib/tmpfiles.d/
-ExecStartPre=touch /run/lock/bluez/obexd.lock
-ExecStopPost=rm -f /run/lock/bluez/obexd.lock
-
 [Install]
 Alias=dbus-org.bluez.obex.service
-- 
2.49.0


^ permalink raw reply related	[flat|nested] 16+ messages in thread

* RE: obexd: unregister profiles when the user is inactive
  2025-04-30 13:14 ` [PATCH BlueZ v6 1/3] obexd: Unregister " Andrew Sayers
@ 2025-04-30 14:58   ` bluez.test.bot
  2025-05-22 14:55   ` [PATCH BlueZ v6 1/3] obexd: Unregister " Frédéric Danis
  1 sibling, 0 replies; 16+ messages in thread
From: bluez.test.bot @ 2025-04-30 14:58 UTC (permalink / raw)
  To: linux-bluetooth, kernel.org

[-- Attachment #1: Type: text/plain, Size: 1261 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=958531

---Test result---

Test Summary:
CheckPatch                    PENDING   0.33 seconds
GitLint                       PENDING   0.22 seconds
BuildEll                      PASS      21.34 seconds
BluezMake                     PASS      3010.56 seconds
MakeCheck                     PASS      20.59 seconds
MakeDistcheck                 PASS      207.85 seconds
CheckValgrind                 PASS      286.19 seconds
CheckSmatch                   PASS      317.67 seconds
bluezmakeextell               PASS      136.41 seconds
IncrementalBuild              PENDING   0.25 seconds
ScanBuild                     PASS      968.58 seconds

Details
##############################
Test: CheckPatch - PENDING
Desc: Run checkpatch.pl script
Output:

##############################
Test: GitLint - PENDING
Desc: Run gitlint
Output:

##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:



---
Regards,
Linux Bluetooth


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH BlueZ v6 0/3] obexd: unregister profiles when the user is inactive
  2025-04-30 13:13 [PATCH BlueZ v6 0/3] obexd: unregister profiles when the user is inactive Andrew Sayers
                   ` (2 preceding siblings ...)
  2025-04-30 13:14 ` [PATCH BlueZ v6 3/3] Revert "obexd: only run one instance at once" Andrew Sayers
@ 2025-05-01 13:50 ` patchwork-bot+bluetooth
  3 siblings, 0 replies; 16+ messages in thread
From: patchwork-bot+bluetooth @ 2025-05-01 13:50 UTC (permalink / raw)
  To: Andrew Sayers; +Cc: linux-bluetooth, luiz.dentz, pav

Hello:

This series was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:

On Wed, 30 Apr 2025 14:13:59 +0100 you wrote:
> This is a follow-up to "obexd: only run one instance at once".
> Instead of refusing to run parallel services, it unregisters
> profiles when the user is inactive.  This avoids the need
> for tmpfiles, and avoids issues where the user with the
> obex service logs out, leaving obex disabled altogether.
> 
> Luiz previously suggested moving this to systemd, but I haven't had much
> luck getting the systemd devs to accept changes, and Pauli's mention of
> elogind (i.e. logind without systemd) suggests it's probably better
> to avoid the dependency anyway.
> 
> [...]

Here is the summary with links:
  - [BlueZ,v6,1/3] obexd: Unregister profiles when the user is inactive
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=765356e80262
  - [BlueZ,v6,2/3] obexd: Support sd_login_monitor_get_timeout()
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=8b29b5a46cdc
  - [BlueZ,v6,3/3] Revert "obexd: only run one instance at once"
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=f8d0dc114036

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH BlueZ v6 1/3] obexd: Unregister profiles when the user is inactive
  2025-04-30 13:14 ` [PATCH BlueZ v6 1/3] obexd: Unregister " Andrew Sayers
  2025-04-30 14:58   ` obexd: unregister " bluez.test.bot
@ 2025-05-22 14:55   ` Frédéric Danis
  2025-05-23 10:33     ` Andrew Sayers
  1 sibling, 1 reply; 16+ messages in thread
From: Frédéric Danis @ 2025-05-22 14:55 UTC (permalink / raw)
  To: Andrew Sayers; +Cc: luiz.dentz, pav, linux-bluetooth

Hi Andrew,

On 30/04/2025 15:14, Andrew Sayers wrote:

> Obexd is usually run as a user service, and can exhibit surprising
> behaviour if two users are logged in at the same time.
>
> Unregister profiles when the user is detected to be off-seat.
>
> It may be impossible to detect whether a user is on-seat in some cases.
> For example, a version of obexd compiled with systemd support might be
> run outside of a systemd environment.  Warn and leave services
> registered if that happens.
>
> Obexd can be run as a system service, in which case this check makes no
> sense.  Disable this check when called with `--system-bus`.
>
> Obexd can also be run by a user that does not have an active session.
> For example, someone could use `ssh` to access the system.  There might
> be a use case where someone needs Bluetooth access but can't log in with
> a keyboard, or there might be a security issue with doing so.  This isn't
> handled explicitly by this patch, but a future patch could add support
> by calling `logind_set(FALSE)` in the same way as is currently done
> with `--system-bus`.
>
> Unregister profiles by closing private connections instead of sending
> UnregisterProfile on the shared connection.  Pipewire has apparently
> found the latter to cause long shutdown delays, because bluetoothd
> may be shutting down and unable to handle this message.
>
> Based in large part on the wireplumber code mentioned by Pauli Virtanen:
> https://gitlab.freedesktop.org/pipewire/wireplumber/-/blob/master/modules/module-logind.c#L52
>
> Other services are likely to need similar functionality,
> so I have created a gist to demonstrate the basic technique:
> https://gist.github.com/andrew-sayers/1c4a24f86a9a4c1b1e38d109f1bd1d1e
>
> Suggested-by: Pauli Virtanen <pav@iki.fi>
> Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>

I have a problem to connect PBAP profile using obexctl, using upstream
bluetoothd and obexd built on Ubuntu 24.04, the org.bluez.obex.PhonebookAccess1
interface doesn't appear.

After bisecting I found that this commit cause this issue.

-- 
Frédéric Danis
Senior Software Engineer

Collabora Ltd.
Platinum Building, St John's Innovation Park, Cambridge CB4 0DS, United Kingdom
Registered in England & Wales, no. 5513718


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH BlueZ v6 1/3] obexd: Unregister profiles when the user is inactive
  2025-05-22 14:55   ` [PATCH BlueZ v6 1/3] obexd: Unregister " Frédéric Danis
@ 2025-05-23 10:33     ` Andrew Sayers
  2025-05-23 11:17       ` Frédéric Danis
  0 siblings, 1 reply; 16+ messages in thread
From: Andrew Sayers @ 2025-05-23 10:33 UTC (permalink / raw)
  To: Frédéric Danis; +Cc: luiz.dentz, pav, linux-bluetooth

On Thu, May 22, 2025 at 04:55:22PM +0200, Frédéric Danis wrote:
> Hi Andrew,
> 
> On 30/04/2025 15:14, Andrew Sayers wrote:
> 
> > Obexd is usually run as a user service, and can exhibit surprising
> > behaviour if two users are logged in at the same time.
> > 
> > Unregister profiles when the user is detected to be off-seat.
> > 
> > It may be impossible to detect whether a user is on-seat in some cases.
> > For example, a version of obexd compiled with systemd support might be
> > run outside of a systemd environment.  Warn and leave services
> > registered if that happens.
> > 
> > Obexd can be run as a system service, in which case this check makes no
> > sense.  Disable this check when called with `--system-bus`.
> > 
> > Obexd can also be run by a user that does not have an active session.
> > For example, someone could use `ssh` to access the system.  There might
> > be a use case where someone needs Bluetooth access but can't log in with
> > a keyboard, or there might be a security issue with doing so.  This isn't
> > handled explicitly by this patch, but a future patch could add support
> > by calling `logind_set(FALSE)` in the same way as is currently done
> > with `--system-bus`.
> > 
> > Unregister profiles by closing private connections instead of sending
> > UnregisterProfile on the shared connection.  Pipewire has apparently
> > found the latter to cause long shutdown delays, because bluetoothd
> > may be shutting down and unable to handle this message.
> > 
> > Based in large part on the wireplumber code mentioned by Pauli Virtanen:
> > https://gitlab.freedesktop.org/pipewire/wireplumber/-/blob/master/modules/module-logind.c#L52
> > 
> > Other services are likely to need similar functionality,
> > so I have created a gist to demonstrate the basic technique:
> > https://gist.github.com/andrew-sayers/1c4a24f86a9a4c1b1e38d109f1bd1d1e
> > 
> > Suggested-by: Pauli Virtanen <pav@iki.fi>
> > Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>
> 
> I have a problem to connect PBAP profile using obexctl, using upstream
> bluetoothd and obexd built on Ubuntu 24.04, the org.bluez.obex.PhonebookAccess1
> interface doesn't appear.
> 
> After bisecting I found that this commit cause this issue.

Hmm, my guess is that seat detection isn't working properly.
Could you try this gist?  You should get "Active: 1" when it starts,
"Active: 0" when you switch away from your current screen, and "Active: 1"
when you switch back.

https://gist.github.com/andrew-sayers/1c4a24f86a9a4c1b1e38d109f1bd1d1e

> 
> -- 
> Frédéric Danis
> Senior Software Engineer
> 
> Collabora Ltd.
> Platinum Building, St John's Innovation Park, Cambridge CB4 0DS, United Kingdom
> Registered in England & Wales, no. 5513718
> 
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH BlueZ v6 1/3] obexd: Unregister profiles when the user is inactive
  2025-05-23 10:33     ` Andrew Sayers
@ 2025-05-23 11:17       ` Frédéric Danis
  2025-05-23 16:31         ` Andrew Sayers
  0 siblings, 1 reply; 16+ messages in thread
From: Frédéric Danis @ 2025-05-23 11:17 UTC (permalink / raw)
  To: Andrew Sayers; +Cc: luiz.dentz, pav, linux-bluetooth

Hi Andrew,

On 23/05/2025 12:33, Andrew Sayers wrote:

> On Thu, May 22, 2025 at 04:55:22PM +0200, Frédéric Danis wrote:
>> Hi Andrew,
>>
>> On 30/04/2025 15:14, Andrew Sayers wrote:
>>
>>> Obexd is usually run as a user service, and can exhibit surprising
>>> behaviour if two users are logged in at the same time.
>>>
>>> Unregister profiles when the user is detected to be off-seat.
>>>
>>> It may be impossible to detect whether a user is on-seat in some cases.
>>> For example, a version of obexd compiled with systemd support might be
>>> run outside of a systemd environment.  Warn and leave services
>>> registered if that happens.
>>>
>>> Obexd can be run as a system service, in which case this check makes no
>>> sense.  Disable this check when called with `--system-bus`.
>>>
>>> Obexd can also be run by a user that does not have an active session.
>>> For example, someone could use `ssh` to access the system.  There might
>>> be a use case where someone needs Bluetooth access but can't log in with
>>> a keyboard, or there might be a security issue with doing so.  This isn't
>>> handled explicitly by this patch, but a future patch could add support
>>> by calling `logind_set(FALSE)` in the same way as is currently done
>>> with `--system-bus`.
>>>
>>> Unregister profiles by closing private connections instead of sending
>>> UnregisterProfile on the shared connection.  Pipewire has apparently
>>> found the latter to cause long shutdown delays, because bluetoothd
>>> may be shutting down and unable to handle this message.
>>>
>>> Based in large part on the wireplumber code mentioned by Pauli Virtanen:
>>> https://gitlab.freedesktop.org/pipewire/wireplumber/-/blob/master/modules/module-logind.c#L52
>>>
>>> Other services are likely to need similar functionality,
>>> so I have created a gist to demonstrate the basic technique:
>>> https://gist.github.com/andrew-sayers/1c4a24f86a9a4c1b1e38d109f1bd1d1e
>>>
>>> Suggested-by: Pauli Virtanen <pav@iki.fi>
>>> Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>
>> I have a problem to connect PBAP profile using obexctl, using upstream
>> bluetoothd and obexd built on Ubuntu 24.04, the org.bluez.obex.PhonebookAccess1
>> interface doesn't appear.
>>
>> After bisecting I found that this commit cause this issue.
> Hmm, my guess is that seat detection isn't working properly.
> Could you try this gist?  You should get "Active: 1" when it starts,
> "Active: 0" when you switch away from your current screen, and "Active: 1"
> when you switch back.
>
> https://gist.github.com/andrew-sayers/1c4a24f86a9a4c1b1e38d109f1bd1d1e
>
It seems to work:
$ ./user-on-seat
Active: 1
Active: 0
Active: 1

But the problem occurred while I didn't try any "seat" change.
I just started bluetoothd, obexd and obexctl, then tried to connect to my phone and got:

     connect 24:24:B7:11:82:6C pbap
     Attempting to connect to 24:24:B7:11:82:6C
     [NEW] Session /org/bluez/obex/client/session0 [default]
     [24:24:B7:11:82:6C]# Connection successful

While I'm expecting:

     connect 24:24:B7:11:82:6C pbap
     Attempting to connect to 24:24:B7:11:82:6C
     [NEW] Session /org/bluez/obex/client/session0 [default]
     [24:24:B7:11:82:6C]# [NEW] PhonebookAccess /org/bluez/obex/client/session0
     [24:24:B7:11:82:6C]# Connection successful

-- 
Frédéric Danis
Senior Software Engineer

Collabora Ltd.
Platinum Building, St John's Innovation Park, Cambridge CB4 0DS, United Kingdom
Registered in England & Wales, no. 5513718


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH BlueZ v6 1/3] obexd: Unregister profiles when the user is inactive
  2025-05-23 11:17       ` Frédéric Danis
@ 2025-05-23 16:31         ` Andrew Sayers
  2025-05-23 17:27           ` Frédéric Danis
  0 siblings, 1 reply; 16+ messages in thread
From: Andrew Sayers @ 2025-05-23 16:31 UTC (permalink / raw)
  To: Frédéric Danis; +Cc: luiz.dentz, pav, linux-bluetooth

On Fri, May 23, 2025 at 01:17:22PM +0200, Frédéric Danis wrote:
> Hi Andrew,
> 
> On 23/05/2025 12:33, Andrew Sayers wrote:
> 
> > On Thu, May 22, 2025 at 04:55:22PM +0200, Frédéric Danis wrote:
> > > Hi Andrew,
> > > 
> > > On 30/04/2025 15:14, Andrew Sayers wrote:
> > > 
> > > > Obexd is usually run as a user service, and can exhibit surprising
> > > > behaviour if two users are logged in at the same time.
> > > > 
> > > > Unregister profiles when the user is detected to be off-seat.
> > > > 
> > > > It may be impossible to detect whether a user is on-seat in some cases.
> > > > For example, a version of obexd compiled with systemd support might be
> > > > run outside of a systemd environment.  Warn and leave services
> > > > registered if that happens.
> > > > 
> > > > Obexd can be run as a system service, in which case this check makes no
> > > > sense.  Disable this check when called with `--system-bus`.
> > > > 
> > > > Obexd can also be run by a user that does not have an active session.
> > > > For example, someone could use `ssh` to access the system.  There might
> > > > be a use case where someone needs Bluetooth access but can't log in with
> > > > a keyboard, or there might be a security issue with doing so.  This isn't
> > > > handled explicitly by this patch, but a future patch could add support
> > > > by calling `logind_set(FALSE)` in the same way as is currently done
> > > > with `--system-bus`.
> > > > 
> > > > Unregister profiles by closing private connections instead of sending
> > > > UnregisterProfile on the shared connection.  Pipewire has apparently
> > > > found the latter to cause long shutdown delays, because bluetoothd
> > > > may be shutting down and unable to handle this message.
> > > > 
> > > > Based in large part on the wireplumber code mentioned by Pauli Virtanen:
> > > > https://gitlab.freedesktop.org/pipewire/wireplumber/-/blob/master/modules/module-logind.c#L52
> > > > 
> > > > Other services are likely to need similar functionality,
> > > > so I have created a gist to demonstrate the basic technique:
> > > > https://gist.github.com/andrew-sayers/1c4a24f86a9a4c1b1e38d109f1bd1d1e
> > > > 
> > > > Suggested-by: Pauli Virtanen <pav@iki.fi>
> > > > Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>
> > > I have a problem to connect PBAP profile using obexctl, using upstream
> > > bluetoothd and obexd built on Ubuntu 24.04, the org.bluez.obex.PhonebookAccess1
> > > interface doesn't appear.
> > > 
> > > After bisecting I found that this commit cause this issue.
> > Hmm, my guess is that seat detection isn't working properly.
> > Could you try this gist?  You should get "Active: 1" when it starts,
> > "Active: 0" when you switch away from your current screen, and "Active: 1"
> > when you switch back.
> > 
> > https://gist.github.com/andrew-sayers/1c4a24f86a9a4c1b1e38d109f1bd1d1e
> > 
> It seems to work:
> $ ./user-on-seat
> Active: 1
> Active: 0
> Active: 1
> 
> But the problem occurred while I didn't try any "seat" change.

Yeah, I was hoping you'd get e.g. 0 / 0 / 1 as output, suggesting it was
inactive at first but changing seats worked around the problem.
Sorry, but this means it'll be harder to debug.  Can you...

1. Check whether PBAP is registered with bluetoothctl:

       bluetoothctl show | grep 0000112e-0000-1000-8000-00805f9b34fb

   You should see one line, like:

       UUID: Phonebook Access Client   (0000112e-0000-1000-8000-00805f9b34fb)

2. Tail the bluetooth and obex logs in another terminal:

       sudo journalctl -f SYSLOG_IDENTIFIER=bluetoothd SYSLOG_IDENTIFIER=obexd

   Steps below will ask you to "make a note" in the log
   (e.g. append "about to do XYZ" to the file) - this will tell me
   which messages were triggered by which events.

3. Make a note in the log, then stop the obex service:

       systemctl --user stop obex.service

4. Check PBAP again:

       bluetoothctl show | grep 0000112e-0000-1000-8000-00805f9b34fb

   You should not see any output.

5. Make another note in the log, then start the obex service:

       systemctl --user start obex.service

6. Check PBAP again:

       bluetoothctl show | grep 0000112e-0000-1000-8000-00805f9b34fb

   You should see the same as in step 1.

8. Make a final note in the log, then try ctrl+alt+F{7,8}.

9. Send me the full log with notes, or at least anything that jumps out at you

Note: the instructions above only print things that are likely to show
problems, and unlikely to contain anything that can't go in an e-mail.  You're
welcome to do `sudo journalctl -f` and or `bluetoothctl show` in another
terminal and go looking for trouble :)

> I just started bluetoothd, obexd and obexctl, then tried to connect to my phone and got:
> 
>     connect 24:24:B7:11:82:6C pbap
>     Attempting to connect to 24:24:B7:11:82:6C
>     [NEW] Session /org/bluez/obex/client/session0 [default]
>     [24:24:B7:11:82:6C]# Connection successful
> 
> While I'm expecting:
> 
>     connect 24:24:B7:11:82:6C pbap
>     Attempting to connect to 24:24:B7:11:82:6C
>     [NEW] Session /org/bluez/obex/client/session0 [default]
>     [24:24:B7:11:82:6C]# [NEW] PhonebookAccess /org/bluez/obex/client/session0
>     [24:24:B7:11:82:6C]# Connection successful
> 
> -- 
> Frédéric Danis
> Senior Software Engineer
> 
> Collabora Ltd.
> Platinum Building, St John's Innovation Park, Cambridge CB4 0DS, United Kingdom
> Registered in England & Wales, no. 5513718
> 
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH BlueZ v6 1/3] obexd: Unregister profiles when the user is inactive
  2025-05-23 16:31         ` Andrew Sayers
@ 2025-05-23 17:27           ` Frédéric Danis
  2025-05-26  9:07             ` Andrew Sayers
  0 siblings, 1 reply; 16+ messages in thread
From: Frédéric Danis @ 2025-05-23 17:27 UTC (permalink / raw)
  To: Andrew Sayers; +Cc: luiz.dentz, pav, linux-bluetooth

Hi Andrew,

On 23/05/2025 18:31, Andrew Sayers wrote:

> On Fri, May 23, 2025 at 01:17:22PM +0200, Frédéric Danis wrote:
>> Hi Andrew,
>>
>> On 23/05/2025 12:33, Andrew Sayers wrote:
>>
>>> On Thu, May 22, 2025 at 04:55:22PM +0200, Frédéric Danis wrote:
>>>> Hi Andrew,
>>>>
>>>> On 30/04/2025 15:14, Andrew Sayers wrote:
>>>>
>>>>> Obexd is usually run as a user service, and can exhibit surprising
>>>>> behaviour if two users are logged in at the same time.
>>>>>
>>>>> Unregister profiles when the user is detected to be off-seat.
>>>>>
>>>>> It may be impossible to detect whether a user is on-seat in some cases.
>>>>> For example, a version of obexd compiled with systemd support might be
>>>>> run outside of a systemd environment.  Warn and leave services
>>>>> registered if that happens.
>>>>>
>>>>> Obexd can be run as a system service, in which case this check makes no
>>>>> sense.  Disable this check when called with `--system-bus`.
>>>>>
>>>>> Obexd can also be run by a user that does not have an active session.
>>>>> For example, someone could use `ssh` to access the system.  There might
>>>>> be a use case where someone needs Bluetooth access but can't log in with
>>>>> a keyboard, or there might be a security issue with doing so.  This isn't
>>>>> handled explicitly by this patch, but a future patch could add support
>>>>> by calling `logind_set(FALSE)` in the same way as is currently done
>>>>> with `--system-bus`.
>>>>>
>>>>> Unregister profiles by closing private connections instead of sending
>>>>> UnregisterProfile on the shared connection.  Pipewire has apparently
>>>>> found the latter to cause long shutdown delays, because bluetoothd
>>>>> may be shutting down and unable to handle this message.
>>>>>
>>>>> Based in large part on the wireplumber code mentioned by Pauli Virtanen:
>>>>> https://gitlab.freedesktop.org/pipewire/wireplumber/-/blob/master/modules/module-logind.c#L52
>>>>>
>>>>> Other services are likely to need similar functionality,
>>>>> so I have created a gist to demonstrate the basic technique:
>>>>> https://gist.github.com/andrew-sayers/1c4a24f86a9a4c1b1e38d109f1bd1d1e
>>>>>
>>>>> Suggested-by: Pauli Virtanen <pav@iki.fi>
>>>>> Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>
>>>> I have a problem to connect PBAP profile using obexctl, using upstream
>>>> bluetoothd and obexd built on Ubuntu 24.04, the org.bluez.obex.PhonebookAccess1
>>>> interface doesn't appear.
>>>>
>>>> After bisecting I found that this commit cause this issue.
>>> Hmm, my guess is that seat detection isn't working properly.
>>> Could you try this gist?  You should get "Active: 1" when it starts,
>>> "Active: 0" when you switch away from your current screen, and "Active: 1"
>>> when you switch back.
>>>
>>> https://gist.github.com/andrew-sayers/1c4a24f86a9a4c1b1e38d109f1bd1d1e
>>>
>> It seems to work:
>> $ ./user-on-seat
>> Active: 1
>> Active: 0
>> Active: 1
>>
>> But the problem occurred while I didn't try any "seat" change.
> Yeah, I was hoping you'd get e.g. 0 / 0 / 1 as output, suggesting it was
> inactive at first but changing seats worked around the problem.
> Sorry, but this means it'll be harder to debug.  Can you...

I manually start bluetoothd and obexd, i.e. I stopped them from systemctl (disable and stop) and start them using cli:
$ src/bluetoothd -nd -E
$ obexd/src/obexd -nd

> 1. Check whether PBAP is registered with bluetoothctl:
>
>         bluetoothctl show | grep 0000112e-0000-1000-8000-00805f9b34fb
>
>     You should see one line, like:
>
>         UUID: Phonebook Access Client   (0000112e-0000-1000-8000-00805f9b34fb)

got:
$ client/bluetoothctl show | grep 0000112e-0000-1000-8000-00805f9b34fb
	UUID: Phonebook Access Client   (0000112e-0000-1000-8000-00805f9b34fb)

> 2. Tail the bluetooth and obex logs in another terminal:
>
>         sudo journalctl -f SYSLOG_IDENTIFIER=bluetoothd SYSLOG_IDENTIFIER=obexd
>
>     Steps below will ask you to "make a note" in the log
>     (e.g. append "about to do XYZ" to the file) - this will tell me
>     which messages were triggered by which events.
>
> 3. Make a note in the log, then stop the obex service:
>
>         systemctl --user stop obex.service
>
> 4. Check PBAP again:
>
>         bluetoothctl show | grep 0000112e-0000-1000-8000-00805f9b34fb
>
>     You should not see any output.

Yes, no output

> 5. Make another note in the log, then start the obex service:
>
>         systemctl --user start obex.service
>
> 6. Check PBAP again:
>
>         bluetoothctl show | grep 0000112e-0000-1000-8000-00805f9b34fb
>
>     You should see the same as in step 1.

Yes:
$ client/bluetoothctl show | grep 0000112e-0000-1000-8000-00805f9b34fb
	UUID: Phonebook Access Client   (0000112e-0000-1000-8000-00805f9b34fb)

> 8. Make a final note in the log, then try ctrl+alt+F{7,8}.
>
> 9. Send me the full log with notes, or at least anything that jumps out at you
>
> Note: the instructions above only print things that are likely to show
> problems, and unlikely to contain anything that can't go in an e-mail.  You're
> welcome to do `sudo journalctl -f` and or `bluetoothctl show` in another
> terminal and go looking for trouble :)

I added the logs for pbap connection.

You can find the log at https://gist.github.com/fdanis-oss/eb6fba440c6b07e9ed5a266672bdbcf3

-- 
Frédéric Danis
Senior Software Engineer

Collabora Ltd.
Platinum Building, St John's Innovation Park, Cambridge CB4 0DS, United Kingdom
Registered in England & Wales, no. 5513718


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH BlueZ v6 1/3] obexd: Unregister profiles when the user is inactive
  2025-05-23 17:27           ` Frédéric Danis
@ 2025-05-26  9:07             ` Andrew Sayers
  0 siblings, 0 replies; 16+ messages in thread
From: Andrew Sayers @ 2025-05-26  9:07 UTC (permalink / raw)
  To: Frédéric Danis; +Cc: luiz.dentz, pav, linux-bluetooth

On Fri, May 23, 2025 at 07:27:51PM +0200, Frédéric Danis wrote:
> Hi Andrew,
> 
> On 23/05/2025 18:31, Andrew Sayers wrote:
> 
> > On Fri, May 23, 2025 at 01:17:22PM +0200, Frédéric Danis wrote:
> > > Hi Andrew,
> > > 
> > > On 23/05/2025 12:33, Andrew Sayers wrote:
> > > 
> > > > On Thu, May 22, 2025 at 04:55:22PM +0200, Frédéric Danis wrote:
> > > > > Hi Andrew,
> > > > > 
> > > > > On 30/04/2025 15:14, Andrew Sayers wrote:
> > > > > 
> > > > > > Obexd is usually run as a user service, and can exhibit surprising
> > > > > > behaviour if two users are logged in at the same time.
> > > > > > 
> > > > > > Unregister profiles when the user is detected to be off-seat.
> > > > > > 
> > > > > > It may be impossible to detect whether a user is on-seat in some cases.
> > > > > > For example, a version of obexd compiled with systemd support might be
> > > > > > run outside of a systemd environment.  Warn and leave services
> > > > > > registered if that happens.
> > > > > > 
> > > > > > Obexd can be run as a system service, in which case this check makes no
> > > > > > sense.  Disable this check when called with `--system-bus`.
> > > > > > 
> > > > > > Obexd can also be run by a user that does not have an active session.
> > > > > > For example, someone could use `ssh` to access the system.  There might
> > > > > > be a use case where someone needs Bluetooth access but can't log in with
> > > > > > a keyboard, or there might be a security issue with doing so.  This isn't
> > > > > > handled explicitly by this patch, but a future patch could add support
> > > > > > by calling `logind_set(FALSE)` in the same way as is currently done
> > > > > > with `--system-bus`.
> > > > > > 
> > > > > > Unregister profiles by closing private connections instead of sending
> > > > > > UnregisterProfile on the shared connection.  Pipewire has apparently
> > > > > > found the latter to cause long shutdown delays, because bluetoothd
> > > > > > may be shutting down and unable to handle this message.
> > > > > > 
> > > > > > Based in large part on the wireplumber code mentioned by Pauli Virtanen:
> > > > > > https://gitlab.freedesktop.org/pipewire/wireplumber/-/blob/master/modules/module-logind.c#L52
> > > > > > 
> > > > > > Other services are likely to need similar functionality,
> > > > > > so I have created a gist to demonstrate the basic technique:
> > > > > > https://gist.github.com/andrew-sayers/1c4a24f86a9a4c1b1e38d109f1bd1d1e
> > > > > > 
> > > > > > Suggested-by: Pauli Virtanen <pav@iki.fi>
> > > > > > Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>
> > > > > I have a problem to connect PBAP profile using obexctl, using upstream
> > > > > bluetoothd and obexd built on Ubuntu 24.04, the org.bluez.obex.PhonebookAccess1
> > > > > interface doesn't appear.
> > > > > 
> > > > > After bisecting I found that this commit cause this issue.
> > > > Hmm, my guess is that seat detection isn't working properly.
> > > > Could you try this gist?  You should get "Active: 1" when it starts,
> > > > "Active: 0" when you switch away from your current screen, and "Active: 1"
> > > > when you switch back.
> > > > 
> > > > https://gist.github.com/andrew-sayers/1c4a24f86a9a4c1b1e38d109f1bd1d1e
> > > > 
> > > It seems to work:
> > > $ ./user-on-seat
> > > Active: 1
> > > Active: 0
> > > Active: 1
> > > 
> > > But the problem occurred while I didn't try any "seat" change.
> > Yeah, I was hoping you'd get e.g. 0 / 0 / 1 as output, suggesting it was
> > inactive at first but changing seats worked around the problem.
> > Sorry, but this means it'll be harder to debug.  Can you...
> 
> I manually start bluetoothd and obexd, i.e. I stopped them from systemctl (disable and stop) and start them using cli:
> $ src/bluetoothd -nd -E
> $ obexd/src/obexd -nd
> 
> > 1. Check whether PBAP is registered with bluetoothctl:
> > 
> >         bluetoothctl show | grep 0000112e-0000-1000-8000-00805f9b34fb
> > 
> >     You should see one line, like:
> > 
> >         UUID: Phonebook Access Client   (0000112e-0000-1000-8000-00805f9b34fb)
> 
> got:
> $ client/bluetoothctl show | grep 0000112e-0000-1000-8000-00805f9b34fb
> 	UUID: Phonebook Access Client   (0000112e-0000-1000-8000-00805f9b34fb)
> 
> > 2. Tail the bluetooth and obex logs in another terminal:
> > 
> >         sudo journalctl -f SYSLOG_IDENTIFIER=bluetoothd SYSLOG_IDENTIFIER=obexd
> > 
> >     Steps below will ask you to "make a note" in the log
> >     (e.g. append "about to do XYZ" to the file) - this will tell me
> >     which messages were triggered by which events.
> > 
> > 3. Make a note in the log, then stop the obex service:
> > 
> >         systemctl --user stop obex.service
> > 
> > 4. Check PBAP again:
> > 
> >         bluetoothctl show | grep 0000112e-0000-1000-8000-00805f9b34fb
> > 
> >     You should not see any output.
> 
> Yes, no output
> 
> > 5. Make another note in the log, then start the obex service:
> > 
> >         systemctl --user start obex.service
> > 
> > 6. Check PBAP again:
> > 
> >         bluetoothctl show | grep 0000112e-0000-1000-8000-00805f9b34fb
> > 
> >     You should see the same as in step 1.
> 
> Yes:
> $ client/bluetoothctl show | grep 0000112e-0000-1000-8000-00805f9b34fb
> 	UUID: Phonebook Access Client   (0000112e-0000-1000-8000-00805f9b34fb)
> 
> > 8. Make a final note in the log, then try ctrl+alt+F{7,8}.
> > 
> > 9. Send me the full log with notes, or at least anything that jumps out at you
> > 
> > Note: the instructions above only print things that are likely to show
> > problems, and unlikely to contain anything that can't go in an e-mail.  You're
> > welcome to do `sudo journalctl -f` and or `bluetoothctl show` in another
> > terminal and go looking for trouble :)
> 
> I added the logs for pbap connection.
> 
> You can find the log at https://gist.github.com/fdanis-oss/eb6fba440c6b07e9ed5a266672bdbcf3

Quick update:

The above was enough to replicate the bug - thanks!
I'm working on a fix, but am unlikely to have a patch before next week.

Long update:

Changing `g_dbus_setup_private()` to `g_dbus_setup()` in pbap.c seems to
fix this problem (but introduces other problems).  I think obexctl is
sending a request that gets received by the normal DBus connection,
which no longer routes the message through to PBAP.  But I'm not yet
confident enough with the codebase to be sure that's what's happening.

If I'm right, the solution is probably to either revisit the idea of
(un)registering things in the normal connection, or to listen for
messages on PBAP's private connection.  But I'm not yet confident enough
with DBus to properly assess either solution.

Neither of the above should take a *huge* amount of time, but will need
a larger block of focussed attention than I'm likely to have this week.
I might get lucky and have a patch by mid-week, but the safer assumption
is that it'll be top of next week's todo list.

> 
> -- 
> Frédéric Danis
> Senior Software Engineer
> 
> Collabora Ltd.
> Platinum Building, St John's Innovation Park, Cambridge CB4 0DS, United Kingdom
> Registered in England & Wales, no. 5513718
> 
> 

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2025-05-26  9:08 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-30 13:13 [PATCH BlueZ v6 0/3] obexd: unregister profiles when the user is inactive Andrew Sayers
2025-04-30 13:14 ` [PATCH BlueZ v6 1/3] obexd: Unregister " Andrew Sayers
2025-04-30 14:58   ` obexd: unregister " bluez.test.bot
2025-05-22 14:55   ` [PATCH BlueZ v6 1/3] obexd: Unregister " Frédéric Danis
2025-05-23 10:33     ` Andrew Sayers
2025-05-23 11:17       ` Frédéric Danis
2025-05-23 16:31         ` Andrew Sayers
2025-05-23 17:27           ` Frédéric Danis
2025-05-26  9:07             ` Andrew Sayers
2025-04-30 13:14 ` [PATCH BlueZ v6 2/3] obexd: Support sd_login_monitor_get_timeout() Andrew Sayers
2025-04-30 13:14 ` [PATCH BlueZ v6 3/3] Revert "obexd: only run one instance at once" Andrew Sayers
2025-05-01 13:50 ` [PATCH BlueZ v6 0/3] obexd: unregister profiles when the user is inactive patchwork-bot+bluetooth
  -- strict thread matches above, loose matches on Subject: below --
2025-04-29 14:14 [PATCH BlueZ v5 1/6] pbap: Support calling pbap_init() after pbap_exit() Andrew Sayers
2025-04-29 15:51 ` obexd: unregister profiles when the user is inactive bluez.test.bot
2025-04-28 13:15 [PATCH BlueZ v4 1/6] pbap: Support calling pbap_init() after pbap_exit() Andrew Sayers
2025-04-28 14:57 ` obexd: unregister profiles when the user is inactive bluez.test.bot
2025-04-25 19:17 [PATCH BlueZ v3 1/5] pbap: Support calling pbap_init() after pbap_exit() Andrew Sayers
2025-04-25 20:40 ` obexd: unregister profiles when the user is inactive bluez.test.bot
2025-04-25 17:13 [PATCH BlueZ v2 1/5] pbap: Support calling pbap_init() after pbap_exit() Andrew Sayers
2025-04-25 18:50 ` obexd: unregister profiles when the user is inactive bluez.test.bot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox