* [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
* 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 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
* [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: [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
* [PATCH BlueZ v5 1/6] pbap: Support calling pbap_init() after pbap_exit() @ 2025-04-29 14:14 Andrew Sayers 2025-04-29 15:51 ` obexd: unregister profiles when the user is inactive bluez.test.bot 0 siblings, 1 reply; 16+ messages in thread From: Andrew Sayers @ 2025-04-29 14:14 UTC (permalink / raw) To: linux-bluetooth; +Cc: luiz.dentz, pav, Andrew Sayers pbap_exit() didn't previously unregister itself thoroughly. That was fine if it was only called when the service was about to exit, because everything was implicitly unregistered when the process ended. But we need to be more scrupulous if this can be called throughout the program's lifecycle. Send the UnregisterProfile message directly from pbap_exit(), then call unregister_profile(). The UnregisterProfile message can't be sent directly from unregister_profile(), because that also needs to be called when register_profile() fails halfway through. Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org> --- obexd/client/pbap.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/obexd/client/pbap.c b/obexd/client/pbap.c index 2f234fadf..90f8bdc02 100644 --- a/obexd/client/pbap.c +++ b/obexd/client/pbap.c @@ -1485,8 +1485,20 @@ void pbap_exit(void) { DBG(""); - dbus_connection_unref(conn); - conn = NULL; + g_dbus_remove_watch(system_conn, listener_id); + + unregister_profile(); + + if (system_conn) { + dbus_connection_close(system_conn); + dbus_connection_unref(system_conn); + system_conn = NULL; + } + + if (conn) { + dbus_connection_unref(conn); + conn = NULL; + } obc_driver_unregister(&pbap); } -- 2.49.0 ^ permalink raw reply related [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 v4 1/6] pbap: Support calling pbap_init() after pbap_exit() @ 2025-04-28 13:15 Andrew Sayers 2025-04-28 14:57 ` obexd: unregister profiles when the user is inactive bluez.test.bot 0 siblings, 1 reply; 16+ messages in thread From: Andrew Sayers @ 2025-04-28 13:15 UTC (permalink / raw) To: linux-bluetooth; +Cc: luiz.dentz, pav, Andrew Sayers pbap_exit() didn't previously unregister itself thoroughly. That was fine if it was only called when the service was about to exit, because everything was implicitly unregistered when the process ended. But we need to be more scrupulous if this can be called throughout the program's lifecycle. Send the UnregisterProfile message directly from pbap_exit(), then call unregister_profile(). The UnregisterProfile message can't be sent directly from unregister_profile(), because that also needs to be called when register_profile() fails halfway through. Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org> --- obexd/client/pbap.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/obexd/client/pbap.c b/obexd/client/pbap.c index 2f234fadf..90f8bdc02 100644 --- a/obexd/client/pbap.c +++ b/obexd/client/pbap.c @@ -1485,8 +1485,20 @@ void pbap_exit(void) { DBG(""); - dbus_connection_unref(conn); - conn = NULL; + g_dbus_remove_watch(system_conn, listener_id); + + unregister_profile(); + + if (system_conn) { + dbus_connection_close(system_conn); + dbus_connection_unref(system_conn); + system_conn = NULL; + } + + if (conn) { + dbus_connection_unref(conn); + conn = NULL; + } obc_driver_unregister(&pbap); } -- 2.49.0 ^ permalink raw reply related [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
* [PATCH BlueZ v3 1/5] pbap: Support calling pbap_init() after pbap_exit() @ 2025-04-25 19:17 Andrew Sayers 2025-04-25 20:40 ` obexd: unregister profiles when the user is inactive bluez.test.bot 0 siblings, 1 reply; 16+ messages in thread From: Andrew Sayers @ 2025-04-25 19:17 UTC (permalink / raw) To: linux-bluetooth; +Cc: luiz.dentz, pav, Andrew Sayers pbap_exit() didn't previously unregister itself thoroughly. That was fine if it was only called when the service was about to exit, because everything was implicitly unregistered when the process ended. But we need to be more scrupulous if this can be called throughout the program's lifecycle. Send the UnregisterProfile message directly from pbap_exit(), then call unregister_profile(). The UnregisterProfile message can't be sent directly from unregister_profile(), because that also needs to be called when register_profile() fails halfway through. Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org> --- obexd/client/pbap.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/obexd/client/pbap.c b/obexd/client/pbap.c index 2f234fadf..90f8bdc02 100644 --- a/obexd/client/pbap.c +++ b/obexd/client/pbap.c @@ -1485,8 +1485,20 @@ void pbap_exit(void) { DBG(""); - dbus_connection_unref(conn); - conn = NULL; + g_dbus_remove_watch(system_conn, listener_id); + + unregister_profile(); + + if (system_conn) { + dbus_connection_close(system_conn); + dbus_connection_unref(system_conn); + system_conn = NULL; + } + + if (conn) { + dbus_connection_unref(conn); + conn = NULL; + } obc_driver_unregister(&pbap); } -- 2.49.0 ^ permalink raw reply related [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
* [PATCH BlueZ v2 1/5] pbap: Support calling pbap_init() after pbap_exit() @ 2025-04-25 17:13 Andrew Sayers 2025-04-25 18:50 ` obexd: unregister profiles when the user is inactive bluez.test.bot 0 siblings, 1 reply; 16+ messages in thread From: Andrew Sayers @ 2025-04-25 17:13 UTC (permalink / raw) To: linux-bluetooth; +Cc: luiz.dentz, pav, Andrew Sayers pbap_exit() didn't previously unregister itself thoroughly. That was fine if it was only called when the service was about to exit, because everything was implicitly unregistered when the process ended. But we need to be more scrupulous if this can be called throughout the program's lifecycle. Send the UnregisterProfile message directly from pbap_exit(), then call unregister_profile(). The UnregisterProfile message can't be sent directly from unregister_profile(), because that also needs to be called when register_profile() fails halfway through. Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org> --- obexd/client/pbap.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/obexd/client/pbap.c b/obexd/client/pbap.c index 2f234fadf..90f8bdc02 100644 --- a/obexd/client/pbap.c +++ b/obexd/client/pbap.c @@ -1485,8 +1485,20 @@ void pbap_exit(void) { DBG(""); - dbus_connection_unref(conn); - conn = NULL; + g_dbus_remove_watch(system_conn, listener_id); + + unregister_profile(); + + if (system_conn) { + dbus_connection_close(system_conn); + dbus_connection_unref(system_conn); + system_conn = NULL; + } + + if (conn) { + dbus_connection_unref(conn); + conn = NULL; + } obc_driver_unregister(&pbap); } -- 2.49.0 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* 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
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