* [PATCH BlueZ v4 0/6] obexd: unregister profiles when the user is inactive
@ 2025-04-28 13:15 Andrew Sayers
2025-04-28 13:15 ` [PATCH BlueZ v4 1/6] pbap: Support calling pbap_init() after pbap_exit() Andrew Sayers
` (5 more replies)
0 siblings, 6 replies; 10+ messages in thread
From: Andrew Sayers @ 2025-04-28 13:15 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>
---
Pauli pointed out timeout_handler() isn't required by the implementation,
even though the documentation implies otherwise. Having thought about it
over the weekend, it seems hard to avoid concluding both that
timeout_handler() cannot be fully tested in the real world right now;
and that any change to the API would likely happen in many years' time,
when we've all forgotten how to fix the problem. So I've moved that bit
to a separate patch, which can be bisected and reverted if necessary.
Pauli - I appreciate the feedback and wanted to note it in the patch,
without implying you wanted that function kept in. I've settled on
a Cc: line, but happy to change it if you'd prefer.
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
Andrew Sayers (6):
pbap: Support calling pbap_init() after pbap_exit()
obexd/bluetooth: Support calling bluetooth_init() after bluetooth_exit()
obexd: Support creating private system/session bus connections
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 | 33 +++++-
obexd/plugins/bluetooth.c | 30 +++++-
obexd/src/logind.c | 260 ++++++++++++++++++++++++++++++++++++++++++++++
obexd/src/logind.h | 26 +++++
obexd/src/main.c | 12 +++
obexd/src/obex.service.in | 9 --
obexd/src/obexd.h | 2 +
8 files changed, 364 insertions(+), 18 deletions(-)
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH BlueZ v4 1/6] pbap: Support calling pbap_init() after pbap_exit()
2025-04-28 13:15 [PATCH BlueZ v4 0/6] obexd: unregister profiles when the user is inactive Andrew Sayers
@ 2025-04-28 13:15 ` Andrew Sayers
2025-04-28 14:57 ` obexd: unregister profiles when the user is inactive bluez.test.bot
2025-04-28 21:47 ` [PATCH BlueZ v4 1/6] pbap: Support calling pbap_init() after pbap_exit() Luiz Augusto von Dentz
2025-04-28 13:15 ` [PATCH BlueZ v4 2/6] obexd/bluetooth: Support calling bluetooth_init() after bluetooth_exit() Andrew Sayers
` (4 subsequent siblings)
5 siblings, 2 replies; 10+ 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] 10+ messages in thread
* [PATCH BlueZ v4 2/6] obexd/bluetooth: Support calling bluetooth_init() after bluetooth_exit()
2025-04-28 13:15 [PATCH BlueZ v4 0/6] obexd: unregister profiles when the user is inactive Andrew Sayers
2025-04-28 13:15 ` [PATCH BlueZ v4 1/6] pbap: Support calling pbap_init() after pbap_exit() Andrew Sayers
@ 2025-04-28 13:15 ` Andrew Sayers
2025-04-28 13:15 ` [PATCH BlueZ v4 3/6] obexd: Support creating private system/session bus connections Andrew Sayers
` (3 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Andrew Sayers @ 2025-04-28 13:15 UTC (permalink / raw)
To: linux-bluetooth; +Cc: luiz.dentz, pav, Andrew Sayers
bluetooth_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 UnregisterProfile messages directly from bluetooth_exit(),
then call unregister_profile(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.
Do not free profiles in bluetooth_exit() - profiles are needed
by a future call to bluetooth_init(), or will be freed by
bluetooth_stop() if necessary.
Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>
---
obexd/plugins/bluetooth.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/obexd/plugins/bluetooth.c b/obexd/plugins/bluetooth.c
index afb2215bd..8cf718922 100644
--- a/obexd/plugins/bluetooth.c
+++ b/obexd/plugins/bluetooth.c
@@ -440,12 +440,24 @@ static int bluetooth_init(void)
static void bluetooth_exit(void)
{
+ GSList *l;
+
g_dbus_remove_watch(connection, listener_id);
- g_slist_free_full(profiles, profile_free);
+ for (l = profiles; l; l = l->next) {
+ struct bluetooth_profile *profile = l->data;
+
+ if (profile->path == NULL)
+ continue;
+
+ unregister_profile(profile);
+ }
- if (connection)
+ if (connection) {
+ dbus_connection_close(connection);
dbus_connection_unref(connection);
+ connection = NULL;
+ }
obex_transport_driver_unregister(&driver);
}
--
2.49.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH BlueZ v4 3/6] obexd: Support creating private system/session bus connections
2025-04-28 13:15 [PATCH BlueZ v4 0/6] obexd: unregister profiles when the user is inactive Andrew Sayers
2025-04-28 13:15 ` [PATCH BlueZ v4 1/6] pbap: Support calling pbap_init() after pbap_exit() Andrew Sayers
2025-04-28 13:15 ` [PATCH BlueZ v4 2/6] obexd/bluetooth: Support calling bluetooth_init() after bluetooth_exit() Andrew Sayers
@ 2025-04-28 13:15 ` Andrew Sayers
2025-04-28 13:15 ` [PATCH BlueZ v4 4/6] obexd: Unregister profiles when the user is inactive Andrew Sayers
` (2 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Andrew Sayers @ 2025-04-28 13:15 UTC (permalink / raw)
To: linux-bluetooth; +Cc: luiz.dentz, pav, Andrew Sayers
Obexd can either connect to the system or session bus.
We mostly share a common connection to that bus, but it can be useful
to have a private connection. For example, this allows us to quickly
unregister profiles when switching user.
Add obex_setup_dbus_connection_private(), which creates a new
connection to whichever bus was specified by the user.
Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>
---
obexd/src/main.c | 8 ++++++++
obexd/src/obexd.h | 2 ++
2 files changed, 10 insertions(+)
diff --git a/obexd/src/main.c b/obexd/src/main.c
index 703173662..ca95a70de 100644
--- a/obexd/src/main.c
+++ b/obexd/src/main.c
@@ -253,6 +253,14 @@ DBusConnection *obex_setup_dbus_connection(const char *name,
return connection;
}
+DBusConnection *obex_setup_dbus_connection_private(const char *name,
+ DBusError *error)
+{
+ return g_dbus_setup_private(option_system_bus ?
+ DBUS_BUS_SYSTEM : DBUS_BUS_SESSION,
+ name, error);
+}
+
int main(int argc, char *argv[])
{
GOptionContext *context;
diff --git a/obexd/src/obexd.h b/obexd/src/obexd.h
index 5e5edc4de..560db29ce 100644
--- a/obexd/src/obexd.h
+++ b/obexd/src/obexd.h
@@ -33,3 +33,5 @@ const char *obex_option_capability(void);
DBusConnection *obex_get_dbus_connection(void);
DBusConnection *obex_setup_dbus_connection(const char *name,
DBusError *error);
+DBusConnection *obex_setup_dbus_connection_private(const char *name,
+ DBusError *error);
--
2.49.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH BlueZ v4 4/6] obexd: Unregister profiles when the user is inactive
2025-04-28 13:15 [PATCH BlueZ v4 0/6] obexd: unregister profiles when the user is inactive Andrew Sayers
` (2 preceding siblings ...)
2025-04-28 13:15 ` [PATCH BlueZ v4 3/6] obexd: Support creating private system/session bus connections Andrew Sayers
@ 2025-04-28 13:15 ` Andrew Sayers
2025-04-28 13:15 ` [PATCH BlueZ v4 5/6] obexd: Support sd_login_monitor_get_timeout() Andrew Sayers
2025-04-28 13:15 ` [PATCH BlueZ v4 6/6] Revert "obexd: only run one instance at once" Andrew Sayers
5 siblings, 0 replies; 10+ messages in thread
From: Andrew Sayers @ 2025-04-28 13:15 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 | 229 ++++++++++++++++++++++++++++++++++++++
obexd/src/logind.h | 26 +++++
obexd/src/main.c | 4 +
6 files changed, 295 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..eb4924684
--- /dev/null
+++ b/obexd/src/logind.c
@@ -0,0 +1,229 @@
+// 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 <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 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 gboolean event_handler(GIOChannel *source, GIOCondition condition,
+ gpointer data)
+{
+ int res;
+
+ res = sd_login_monitor_flush(monitor);
+ if (res < 0) {
+ error("sd_login_monitor_flush(): %s", strerror(-res));
+ return FALSE;
+ }
+ if (!monitoring_enabled)
+ return TRUE;
+ res = update();
+ if (res < 0) {
+ error("update(): %s", 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);
+
+ source = g_io_add_watch(channel, events, event_handler, NULL);
+
+ g_io_channel_unref(channel);
+
+ event_handler(NULL, 0, NULL);
+
+ return 0;
+
+FAIL:
+ sd_login_monitor_unref(monitor);
+ monitoring_enabled = FALSE;
+ active = TRUE;
+ return res;
+}
+
+static void logind_exit(void)
+{
+ if (source) {
+ g_source_remove(source);
+ 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..1a92a8b87
--- /dev/null
+++ b/obexd/src/logind.h
@@ -0,0 +1,26 @@
+/* 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
+
+typedef int (*logind_init_cb)(void);
+typedef void (*logind_exit_cb)(void);
+
+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
+
+#define logind_register(init_cb, exit_cb) init_cb()
+#define logind_unregister(init_cb, exit_cb) exit_cb()
+#define logind_set(enabled) 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] 10+ messages in thread
* [PATCH BlueZ v4 5/6] obexd: Support sd_login_monitor_get_timeout()
2025-04-28 13:15 [PATCH BlueZ v4 0/6] obexd: unregister profiles when the user is inactive Andrew Sayers
` (3 preceding siblings ...)
2025-04-28 13:15 ` [PATCH BlueZ v4 4/6] obexd: Unregister profiles when the user is inactive Andrew Sayers
@ 2025-04-28 13:15 ` Andrew Sayers
2025-04-28 17:11 ` Pauli Virtanen
2025-04-28 13:15 ` [PATCH BlueZ v4 6/6] Revert "obexd: only run one instance at once" Andrew Sayers
5 siblings, 1 reply; 10+ messages in thread
From: Andrew Sayers @ 2025-04-28 13:15 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.
Cc: Pauli Virtanen <pav@iki.fi>
Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>
---
obexd/src/logind.c | 33 ++++++++++++++++++++++++++++++++-
1 file changed, 32 insertions(+), 1 deletion(-)
diff --git a/obexd/src/logind.c b/obexd/src/logind.c
index eb4924684..5bb9a5986 100644
--- a/obexd/src/logind.c
+++ b/obexd/src/logind.c
@@ -101,6 +101,37 @@ static gboolean event_handler(GIOChannel *source, GIOCondition condition,
return TRUE;
}
+static gboolean timeout_handler(gpointer user_data)
+{
+ uint64_t timeout_usec;
+ int res;
+
+ if (!event_handler(NULL, 0, NULL))
+ return FALSE;
+
+ res = sd_login_monitor_get_timeout(monitor, &timeout_usec);
+ if (res < 0) {
+ error("sd_login_monitor_get_timeout(): %s", strerror(-res));
+ return FALSE;
+ }
+
+ if (timeout_usec != (uint64_t)-1) {
+ uint64_t time_usec;
+ struct timespec ts;
+
+ 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 timeout_handler(user_data);
+ g_timeout_add((timeout_usec - time_usec + 999) / 1000,
+ timeout_handler, user_data);
+ }
+
+ return FALSE;
+}
+
static int logind_init(void)
{
GIOChannel *channel;
@@ -146,7 +177,7 @@ static int logind_init(void)
g_io_channel_unref(channel);
- event_handler(NULL, 0, NULL);
+ timeout_handler(NULL);
return 0;
--
2.49.0
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH BlueZ v4 6/6] Revert "obexd: only run one instance at once"
2025-04-28 13:15 [PATCH BlueZ v4 0/6] obexd: unregister profiles when the user is inactive Andrew Sayers
` (4 preceding siblings ...)
2025-04-28 13:15 ` [PATCH BlueZ v4 5/6] obexd: Support sd_login_monitor_get_timeout() Andrew Sayers
@ 2025-04-28 13:15 ` Andrew Sayers
5 siblings, 0 replies; 10+ messages in thread
From: Andrew Sayers @ 2025-04-28 13:15 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] 10+ 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
2025-04-28 21:47 ` [PATCH BlueZ v4 1/6] pbap: Support calling pbap_init() after pbap_exit() Luiz Augusto von Dentz
1 sibling, 0 replies; 10+ 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] 10+ messages in thread
* Re: [PATCH BlueZ v4 5/6] obexd: Support sd_login_monitor_get_timeout()
2025-04-28 13:15 ` [PATCH BlueZ v4 5/6] obexd: Support sd_login_monitor_get_timeout() Andrew Sayers
@ 2025-04-28 17:11 ` Pauli Virtanen
0 siblings, 0 replies; 10+ messages in thread
From: Pauli Virtanen @ 2025-04-28 17:11 UTC (permalink / raw)
To: Andrew Sayers, linux-bluetooth; +Cc: luiz.dentz
Hi,
ma, 2025-04-28 kello 14:15 +0100, Andrew Sayers kirjoitti:
> 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.
It should be also OK to do things properly and add also the timeout, as
here.
> Cc: Pauli Virtanen <pav@iki.fi>
> Signed-off-by: Andrew Sayers <kernel.org@pileofstuff.org>
> ---
> obexd/src/logind.c | 33 ++++++++++++++++++++++++++++++++-
> 1 file changed, 32 insertions(+), 1 deletion(-)
>
> diff --git a/obexd/src/logind.c b/obexd/src/logind.c
> index eb4924684..5bb9a5986 100644
> --- a/obexd/src/logind.c
> +++ b/obexd/src/logind.c
> @@ -101,6 +101,37 @@ static gboolean event_handler(GIOChannel *source, GIOCondition condition,
> return TRUE;
> }
>
> +static gboolean timeout_handler(gpointer user_data)
I think the intent of the systemd API is that every time you want to
wait for monitor event, both poll() and if get_timeout()!=-1 also
timeout shall be enabled.
So one probably should reschedule the timer on every wakeup, also in
event_handler(). (In theory I guess also the poll event flags might
change on every wakeup. This looks a bit less clumsy in the lower level
GSource API, but I think one shouldn't bikeshed too much on this...)
> +{
> + uint64_t timeout_usec;
> + int res;
> +
> + if (!event_handler(NULL, 0, NULL))
> + return FALSE;
> +
> + res = sd_login_monitor_get_timeout(monitor, &timeout_usec);
> + if (res < 0) {
> + error("sd_login_monitor_get_timeout(): %s", strerror(-res));
> + return FALSE;
> + }
> +
> + if (timeout_usec != (uint64_t)-1) {
> + uint64_t time_usec;
> + struct timespec ts;
> +
> + 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 timeout_handler(user_data);
> + g_timeout_add((timeout_usec - time_usec + 999) / 1000,
> + timeout_handler, user_data);
> + }
> +
> + return FALSE;
> +}
> +
> static int logind_init(void)
> {
> GIOChannel *channel;
> @@ -146,7 +177,7 @@ static int logind_init(void)
>
> g_io_channel_unref(channel);
>
> - event_handler(NULL, 0, NULL);
> + timeout_handler(NULL);
>
> return 0;
>
--
Pauli Virtanen
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH BlueZ v4 1/6] pbap: Support calling pbap_init() after pbap_exit()
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-28 21:47 ` Luiz Augusto von Dentz
1 sibling, 0 replies; 10+ messages in thread
From: Luiz Augusto von Dentz @ 2025-04-28 21:47 UTC (permalink / raw)
To: Andrew Sayers; +Cc: linux-bluetooth, pav
Hi Andrew,
On Mon, Apr 28, 2025 at 9:19 AM Andrew Sayers
<kernel.org@pileofstuff.org> wrote:
>
> 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
Quite a few errors still: https://github.com/bluez/bluez/pull/1208
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2025-04-28 21:48 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-28 13:15 [PATCH BlueZ v4 0/6] obexd: unregister profiles when the user is inactive Andrew Sayers
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-28 21:47 ` [PATCH BlueZ v4 1/6] pbap: Support calling pbap_init() after pbap_exit() Luiz Augusto von Dentz
2025-04-28 13:15 ` [PATCH BlueZ v4 2/6] obexd/bluetooth: Support calling bluetooth_init() after bluetooth_exit() Andrew Sayers
2025-04-28 13:15 ` [PATCH BlueZ v4 3/6] obexd: Support creating private system/session bus connections Andrew Sayers
2025-04-28 13:15 ` [PATCH BlueZ v4 4/6] obexd: Unregister profiles when the user is inactive Andrew Sayers
2025-04-28 13:15 ` [PATCH BlueZ v4 5/6] obexd: Support sd_login_monitor_get_timeout() Andrew Sayers
2025-04-28 17:11 ` Pauli Virtanen
2025-04-28 13:15 ` [PATCH BlueZ v4 6/6] Revert "obexd: only run one instance at once" Andrew Sayers
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox