diff --git a/SOURCES/0001-lib-Fix-a-few-memory-leaks.patch b/SOURCES/0001-lib-Fix-a-few-memory-leaks.patch new file mode 100644 index 0000000..81572f9 --- /dev/null +++ b/SOURCES/0001-lib-Fix-a-few-memory-leaks.patch @@ -0,0 +1,35 @@ +From 91ac544495d874159893eefff1f68332c4780001 Mon Sep 17 00:00:00 2001 +From: Bastien Nocera +Date: Wed, 20 Nov 2013 17:10:07 +0100 +Subject: [PATCH 1/3] lib: Fix a few memory leaks + +--- + lib/bluetooth-client.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/lib/bluetooth-client.c b/lib/bluetooth-client.c +index 8bddb58..1fe7e6d 100644 +--- a/lib/bluetooth-client.c ++++ b/lib/bluetooth-client.c +@@ -1878,8 +1878,10 @@ bluetooth_client_connect_service (BluetoothClient *client, + g_object_unref (proxy); + goto bail; + } ++ g_hash_table_unref (table); + + service = get_proxy_for_iface (DEVICE (proxy), iface_name, client); ++ g_object_unref (proxy); + + g_debug ("Calling 'Connect' on interface %s for %s", + iface_name, g_dbus_proxy_get_object_path (service)); +@@ -1922,6 +1924,7 @@ bluetooth_client_connect_service (BluetoothClient *client, + NULL, + (GAsyncReadyCallback) disconnect_callback, + conndata); ++ g_object_unref (proxy); + } + + return; +-- +1.8.4.2 + diff --git a/SOURCES/0002-lib-Fix-cancellation-handling.patch b/SOURCES/0002-lib-Fix-cancellation-handling.patch new file mode 100644 index 0000000..1baa119 --- /dev/null +++ b/SOURCES/0002-lib-Fix-cancellation-handling.patch @@ -0,0 +1,132 @@ +From 84ec5f5a11908e636ff3b992aecfc5c8f8faddb5 Mon Sep 17 00:00:00 2001 +From: Bastien Nocera +Date: Wed, 20 Nov 2013 17:10:46 +0100 +Subject: [PATCH 2/3] lib: Fix cancellation handling + +We weren't checking for cancellation properly, not passing +cancellables to sub-routines, and not reporting cancelled calls +correctly. +--- + lib/bluetooth-client.c | 30 ++++++++++++++++++------------ + 1 file changed, 18 insertions(+), 12 deletions(-) + +diff --git a/lib/bluetooth-client.c b/lib/bluetooth-client.c +index 1fe7e6d..e224033 100644 +--- a/lib/bluetooth-client.c ++++ b/lib/bluetooth-client.c +@@ -1661,23 +1661,20 @@ connect_callback (GDBusProxy *proxy, + ConnectData *conndata) + { + GVariant *variant; +- gboolean retval; + GError *error = NULL; + + variant = g_dbus_proxy_call_finish (proxy, res, &error); + if (variant == NULL) { +- retval = FALSE; + g_debug ("Connect failed for %s: %s", + g_dbus_proxy_get_object_path (proxy), error->message); +- g_error_free (error); ++ g_simple_async_result_take_error (conndata->simple, error); + } else { + g_debug ("Connect succeeded for %s", + g_dbus_proxy_get_object_path (proxy)); + g_variant_unref (variant); +- retval = TRUE; ++ g_simple_async_result_set_op_res_gboolean (conndata->simple, TRUE); + } + +- g_simple_async_result_set_op_res_gboolean (conndata->simple, retval); + g_simple_async_result_complete_in_idle (conndata->simple); + + g_object_unref (conndata->simple); +@@ -1699,10 +1696,11 @@ disconnect_callback (GDBusProxy *proxy, + g_debug ("Disconnect failed for %s: %s", + g_dbus_proxy_get_object_path (G_DBUS_PROXY (conndata->device)), + error->message); +- g_error_free (error); ++ g_simple_async_result_take_error (conndata->simple, error); + } else { + g_debug ("Disconnect succeeded for %s", + g_dbus_proxy_get_object_path (G_DBUS_PROXY (conndata->device))); ++ g_simple_async_result_set_op_res_gboolean (conndata->simple, retval); + } + } else { + GDBusProxy *service; +@@ -1716,6 +1714,10 @@ disconnect_callback (GDBusProxy *proxy, + g_dbus_proxy_get_object_path (proxy), + g_dbus_proxy_get_interface_name (proxy), + error->message); ++ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { ++ g_simple_async_result_take_error (conndata->simple, error); ++ goto bail; ++ } + g_error_free (error); + } else { + g_debug ("Disconnect succeeded for %s on %s", +@@ -1737,14 +1739,14 @@ disconnect_callback (GDBusProxy *proxy, + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, +- NULL, ++ g_object_get_data (G_OBJECT (conndata->simple), "cancellable"), + (GAsyncReadyCallback) disconnect_callback, + conndata); + + return; + } + +- g_simple_async_result_set_op_res_gboolean (conndata->simple, retval); ++bail: + g_simple_async_result_complete_in_idle (conndata->simple); + + g_object_unref (proxy); +@@ -1836,6 +1838,7 @@ bluetooth_client_connect_service (BluetoothClient *client, + g_object_set_data_full (G_OBJECT (simple), "device", + g_strdup (device), g_free); + } ++ g_simple_async_result_set_check_cancellable (simple, cancellable); + + gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &iter, + BLUETOOTH_COLUMN_PROXY, &proxy, +@@ -1891,7 +1894,7 @@ bluetooth_client_connect_service (BluetoothClient *client, + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, +- NULL, ++ cancellable, + (GAsyncReadyCallback) connect_callback, + conndata); + } else if (table != NULL) { +@@ -1914,14 +1917,14 @@ bluetooth_client_connect_service (BluetoothClient *client, + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, +- NULL, ++ cancellable, + (GAsyncReadyCallback) disconnect_callback, + conndata); + } else if (table == NULL) { + g_debug ("Calling device_call_disconnect() for %s", + g_dbus_proxy_get_object_path (proxy)); + device_call_disconnect (DEVICE (proxy), +- NULL, ++ cancellable, + (GAsyncReadyCallback) disconnect_callback, + conndata); + g_object_unref (proxy); +@@ -1956,7 +1959,10 @@ bluetooth_client_connect_service_finish (BluetoothClient *client, + + g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == bluetooth_client_connect_service); + +- return g_simple_async_result_get_op_res_gboolean (simple); ++ if (g_simple_async_result_get_op_res_gboolean (simple)) ++ return TRUE; ++ g_simple_async_result_propagate_error (simple, error); ++ return FALSE; + } + + #define BOOL_STR(x) (x ? "True" : "False") +-- +1.8.4.2 + diff --git a/SOURCES/0003-lib-Fix-extraneous-reference-that-could-lead-to-cras.patch b/SOURCES/0003-lib-Fix-extraneous-reference-that-could-lead-to-cras.patch new file mode 100644 index 0000000..472a506 --- /dev/null +++ b/SOURCES/0003-lib-Fix-extraneous-reference-that-could-lead-to-cras.patch @@ -0,0 +1,29 @@ +From fbc1ce2836ccf17368fb6fe2aa0c69396c610aa5 Mon Sep 17 00:00:00 2001 +From: Bastien Nocera +Date: Wed, 20 Nov 2013 17:11:32 +0100 +Subject: [PATCH 3/3] lib: Fix extraneous reference that could lead to crash + +The proxy we got from the tree model was already the extra +reference we needed. This makes sure that all additional +instances of the device (the ones not in the tree model) +are destroyed when cancelling a disconnect call. +--- + lib/bluetooth-client.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/bluetooth-client.c b/lib/bluetooth-client.c +index e224033..c5e86de 100644 +--- a/lib/bluetooth-client.c ++++ b/lib/bluetooth-client.c +@@ -1900,7 +1900,7 @@ bluetooth_client_connect_service (BluetoothClient *client, + } else if (table != NULL) { + GDBusProxy *service; + +- conndata->device = g_object_ref (DEVICE (proxy)); ++ conndata->device = DEVICE (proxy); + conndata->services = g_hash_table_get_keys (table); + g_hash_table_unref (table); + conndata->services = g_list_sort (conndata->services, (GCompareFunc) rev_sort_services); +-- +1.8.4.2 + diff --git a/SPECS/gnome-bluetooth.spec b/SPECS/gnome-bluetooth.spec index f92a9e7..88cd481 100644 --- a/SPECS/gnome-bluetooth.spec +++ b/SPECS/gnome-bluetooth.spec @@ -1,7 +1,7 @@ Name: gnome-bluetooth Epoch: 1 Version: 3.8.2.1 -Release: 1%{?dist} +Release: 3%{?dist} Summary: Bluetooth graphical utilities Group: Applications/Communications @@ -10,6 +10,10 @@ URL: http://live.gnome.org/GnomeBluetooth Source0: http://download.gnome.org/sources/gnome-bluetooth/3.8/gnome-bluetooth-%{version}.tar.xz Source1: 61-gnome-bluetooth-rfkill.rules +Patch0: 0001-lib-Fix-a-few-memory-leaks.patch +Patch1: 0002-lib-Fix-cancellation-handling.patch +Patch2: 0003-lib-Fix-extraneous-reference-that-could-lead-to-cras.patch + %if 0%{?rhel} ExcludeArch: s390 s390x %endif @@ -68,6 +72,9 @@ for writing applications that require a Bluetooth device selection widget. %prep %setup -q +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 %build %configure --disable-desktop-update --disable-icon-update --disable-schemas-compile --disable-compile-warnings @@ -142,6 +149,13 @@ fi %{_datadir}/gtk-doc %changelog +* Fri Dec 27 2013 Daniel Mach - 1:3.8.2.1-3 +- Mass rebuild 2013-12-27 + +* Fri Nov 22 2013 Bastien Nocera 3.8.2.1-2 +- Fix crasher when disconnecting from a Bluetooth device +Resolves: #1028078 + * Thu Oct 31 2013 Bastien Nocera 3.8.2.1-1 - Update to 3.8.2.1 Resolves: #886464