[gnome-bluetooth] lib: Fix possible crash on startup
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-bluetooth] lib: Fix possible crash on startup
- Date: Fri, 16 Feb 2018 11:14:19 +0000 (UTC)
commit c5190d319e72e0d27a37242033ac0a59806015d5
Author: Bastien Nocera <hadess hadess net>
Date: Fri Feb 16 10:58:22 2018 +0100
lib: Fix possible crash on startup
Fix possible crash when the object creation is cancelled on startup. We
shouldn't be using user_data until we know that the call has not been
cancelled, otherwise we could be accessing already freed memory.
#0 g_type_check_instance_cast (type_instance=type_instance@entry=0x208dc60, iface_type=34189312) at
/home/hadess/Projects/jhbuild/glib/gobject/gtype.c:4057
#1 0x00007f34c8d09522 in object_manager_new_callback (source_object=<optimized out>, res=0x208c390,
user_data=user_data@entry=0x208dc60)
at ../../../../Projects/jhbuild/gnome-bluetooth/lib/bluetooth-client.c:761
#2 0x00007f34ce7d819a in g_task_return_now (task=0x208c390) at
/home/hadess/Projects/jhbuild/glib/gio/gtask.c:1148
#3 0x00007f34ce7d81d9 in complete_in_idle_cb (task=task@entry=0x208c390) at
/home/hadess/Projects/jhbuild/glib/gio/gtask.c:1162
https://bugzilla.gnome.org/show_bug.cgi?id=793505
lib/bluetooth-client.c | 16 +++++++++++-----
1 files changed, 11 insertions(+), 5 deletions(-)
---
diff --git a/lib/bluetooth-client.c b/lib/bluetooth-client.c
index 0233537..2a8db62 100644
--- a/lib/bluetooth-client.c
+++ b/lib/bluetooth-client.c
@@ -758,18 +758,24 @@ object_manager_new_callback(GObject *source_object,
GAsyncResult *res,
void *user_data)
{
- BluetoothClient *client = BLUETOOTH_CLIENT (user_data);
- BluetoothClientPrivate *priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
+ BluetoothClient *client;
+ BluetoothClientPrivate *priv;
+ GDBusObjectManager *manager;
GList *object_list, *l;
GError *error = NULL;
- priv->manager = g_dbus_object_manager_client_new_for_bus_finish (res, &error);
- if (error) {
- g_warning ("Could not create bluez object manager: %s", error->message);
+ manager = g_dbus_object_manager_client_new_for_bus_finish (res, &error);
+ if (!manager) {
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ g_warning ("Could not create bluez object manager: %s", error->message);
g_error_free (error);
return;
}
+ client = BLUETOOTH_CLIENT (user_data);
+ priv = BLUETOOTH_CLIENT_GET_PRIVATE(client);
+ priv->manager = manager;
+
g_signal_connect (G_OBJECT (priv->manager), "interface-added", (GCallback) interface_added, client);
g_signal_connect (G_OBJECT (priv->manager), "interface-removed", (GCallback) interface_removed,
client);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]