Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Hi, please unblock gnome-settings-daemon for the fix to two infamous bugs: - crash upon startup when CUPS doesn’t answer, - infinite loop with NumLock switching. It should also startup faster. gnome-settings-daemon (3.4.2+git20120925.a4c817-2) unstable; urgency=low * Pull upstream fixes for the print-notifications plugin: + 01_print_proxy.patch: don’t create an unused GDBusProxy. + 02_print_init.patch: delay CUPS initialization. + 03_print_async.patch: test asynchronously whether the CUPS server actually works. Closes: #687978. * 11_numlock_loop.patch: patch from Andrew Potter to fix infinite loop triggered by switching the numlock status. * gnome-settings-daemon.gsettings-override: dropped, NumLock saving is back to work now. unblock gnome-settings-daemon/3.4.2+git20120925.a4c817-2 Thanks, -- .''`. Josselin Mouette : :' : `. `' `-
diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/changelog gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/changelog --- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/changelog 2012-09-29 13:13:39.000000000 +0200 +++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/changelog 2012-10-26 19:04:58.000000000 +0200 @@ -1,3 +1,17 @@ +gnome-settings-daemon (3.4.2+git20120925.a4c817-2) unstable; urgency=low + + * Pull upstream fixes for the print-notifications plugin: + + 01_print_proxy.patch: don’t create an unused GDBusProxy. + + 02_print_init.patch: delay CUPS initialization. + + 03_print_async.patch: test asynchronously whether the CUPS server + actually works. Closes: #687978. + * 11_numlock_loop.patch: patch from Andrew Potter to fix infinite loop + triggered by switching the numlock status. + * gnome-settings-daemon.gsettings-override: dropped, NumLock saving is + back to work now. + + -- Josselin Mouette <j...@debian.org> Fri, 26 Oct 2012 19:04:37 +0200 + gnome-settings-daemon (3.4.2+git20120925.a4c817-1) unstable; urgency=low * debian/g-s-d.gsettings-override: disable remember-numlock-state, diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/gnome-settings-daemon.gsettings-override gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/gnome-settings-daemon.gsettings-override --- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/gnome-settings-daemon.gsettings-override 2012-09-29 12:14:58.000000000 +0200 +++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/gnome-settings-daemon.gsettings-override 1970-01-01 01:00:00.000000000 +0100 @@ -1,2 +0,0 @@ -[org.gnome.settings-daemon.peripherals.keyboard] -remember-numlock-state=false diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/01_print_proxy.patch gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/01_print_proxy.patch --- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/01_print_proxy.patch 1970-01-01 01:00:00.000000000 +0100 +++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/01_print_proxy.patch 2012-10-26 18:51:44.000000000 +0200 @@ -0,0 +1,87 @@ +From 4dd2bc1f5ba76663710285d4d9c17172682af56e Mon Sep 17 00:00:00 2001 +From: Matthias Clasen <mcla...@redhat.com> +Date: Sat, 21 Apr 2012 23:26:05 +0000 +Subject: print-notifications: Don't create an unused proxy object + +The proxy object was not used for anything, and it was creating +synchronously. + +https://bugzilla.gnome.org/show_bug.cgi?id=674550 +--- +diff --git a/plugins/print-notifications/gsd-print-notifications-manager.c b/plugins/print-notifications/gsd-print-notifications-manager.c +index bb9c7b9..44fbbbe 100644 +--- a/plugins/print-notifications/gsd-print-notifications-manager.c ++++ b/plugins/print-notifications/gsd-print-notifications-manager.c +@@ -54,7 +54,6 @@ + + struct GsdPrintNotificationsManagerPrivate + { +- GDBusProxy *cups_proxy; + GDBusConnection *cups_bus_connection; + gint subscription_id; + cups_dest_t *dests; +@@ -909,8 +908,6 @@ gboolean + gsd_print_notifications_manager_start (GsdPrintNotificationsManager *manager, + GError **error) + { +- GError *lerror; +- + g_debug ("Starting print-notifications manager"); + + gnome_settings_profile_start (NULL); +@@ -925,25 +922,12 @@ gsd_print_notifications_manager_start (GsdPrintNotificationsManager *manager, + + renew_subscription (manager); + g_timeout_add_seconds (RENEW_INTERVAL, renew_subscription, manager); ++ gnome_settings_profile_msg ("renewed subscriptions"); + + manager->priv->num_dests = cupsGetDests (&manager->priv->dests); ++ gnome_settings_profile_msg ("got dests"); + +- lerror = NULL; +- manager->priv->cups_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, +- 0, +- NULL, +- CUPS_DBUS_NAME, +- CUPS_DBUS_PATH, +- CUPS_DBUS_INTERFACE, +- NULL, +- &lerror); +- +- if (lerror != NULL) { +- g_propagate_error (error, lerror); +- return FALSE; +- } +- +- manager->priv->cups_bus_connection = g_dbus_proxy_get_connection (manager->priv->cups_proxy); ++ manager->priv->cups_bus_connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL); + + g_dbus_connection_signal_subscribe (manager->priv->cups_bus_connection, + NULL, +@@ -981,12 +965,7 @@ gsd_print_notifications_manager_stop (GsdPrintNotificationsManager *manager) + + g_hash_table_destroy (manager->priv->printing_printers); + +- manager->priv->cups_bus_connection = NULL; +- +- if (manager->priv->cups_proxy != NULL) { +- g_object_unref (manager->priv->cups_proxy); +- manager->priv->cups_proxy = NULL; +- } ++ g_clear_object (&manager->priv->cups_bus_connection); + + for (tmp = manager->priv->timeouts; tmp; tmp = g_list_next (tmp)) { + data = (TimeoutData *) tmp->data; +@@ -1058,10 +1037,6 @@ gsd_print_notifications_manager_finalize (GObject *object) + + g_return_if_fail (manager->priv != NULL); + +- if (manager->priv->cups_proxy != NULL) { +- g_object_unref (manager->priv->cups_proxy); +- } +- + G_OBJECT_CLASS (gsd_print_notifications_manager_parent_class)->finalize (object); + } + +-- +cgit v0.9.0.2 diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/02_print_init.patch gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/02_print_init.patch --- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/02_print_init.patch 1970-01-01 01:00:00.000000000 +0100 +++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/02_print_init.patch 2012-10-26 18:51:44.000000000 +0200 @@ -0,0 +1,89 @@ +From 5f1df8fc7767b9d5967bbbe988346f22995a6285 Mon Sep 17 00:00:00 2001 +From: Matthias Clasen <mcla...@redhat.com> +Date: Mon, 23 Apr 2012 15:14:28 +0000 +Subject: printers: Move expensive initialization to an idle + +The start() function is running before gsd finishes its +session registration, so everything we do here is in the +critical path for session startup. Both cupsGetDests and +the subscription registration are potentially expensive, +and can very well be done later. + +https://bugzilla.gnome.org/show_bug.cgi?id=674551 +--- +diff --git a/plugins/print-notifications/gsd-print-notifications-manager.c b/plugins/print-notifications/gsd-print-notifications-manager.c +index 44fbbbe..33e6452 100644 +--- a/plugins/print-notifications/gsd-print-notifications-manager.c ++++ b/plugins/print-notifications/gsd-print-notifications-manager.c +@@ -904,25 +904,17 @@ renew_subscription (gpointer data) + return TRUE; + } + +-gboolean +-gsd_print_notifications_manager_start (GsdPrintNotificationsManager *manager, +- GError **error) ++static gboolean ++gsd_print_notifications_manager_start_idle (gpointer data) + { +- g_debug ("Starting print-notifications manager"); ++ GsdPrintNotificationsManager *manager = data; + + gnome_settings_profile_start (NULL); + +- manager->priv->subscription_id = -1; +- manager->priv->dests = NULL; +- manager->priv->num_dests = 0; +- manager->priv->scp_handler_spawned = FALSE; +- manager->priv->timeouts = NULL; + manager->priv->printing_printers = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); +- manager->priv->active_notifications = NULL; + + renew_subscription (manager); + g_timeout_add_seconds (RENEW_INTERVAL, renew_subscription, manager); +- gnome_settings_profile_msg ("renewed subscriptions"); + + manager->priv->num_dests = cupsGetDests (&manager->priv->dests); + gnome_settings_profile_msg ("got dests"); +@@ -944,6 +936,30 @@ gsd_print_notifications_manager_start (GsdPrintNotificationsManager *manager, + + gnome_settings_profile_end (NULL); + ++ return G_SOURCE_REMOVE; ++} ++ ++gboolean ++gsd_print_notifications_manager_start (GsdPrintNotificationsManager *manager, ++ GError **error) ++{ ++ g_debug ("Starting print-notifications manager"); ++ ++ gnome_settings_profile_start (NULL); ++ ++ manager->priv->subscription_id = -1; ++ manager->priv->dests = NULL; ++ manager->priv->num_dests = 0; ++ manager->priv->scp_handler_spawned = FALSE; ++ manager->priv->timeouts = NULL; ++ manager->priv->printing_printers = NULL; ++ manager->priv->active_notifications = NULL; ++ manager->priv->cups_bus_connection = NULL; ++ ++ g_idle_add (gsd_print_notifications_manager_start_idle, manager); ++ ++ gnome_settings_profile_end (NULL); ++ + return TRUE; + } + +@@ -963,7 +979,8 @@ gsd_print_notifications_manager_stop (GsdPrintNotificationsManager *manager) + if (manager->priv->subscription_id >= 0) + cancel_subscription (manager->priv->subscription_id); + +- g_hash_table_destroy (manager->priv->printing_printers); ++ if (manager->priv->printing_printers) ++ g_hash_table_destroy (manager->priv->printing_printers); + + g_clear_object (&manager->priv->cups_bus_connection); + +-- +cgit v0.9.0.2 diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/03_print_async.patch gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/03_print_async.patch --- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/03_print_async.patch 1970-01-01 01:00:00.000000000 +0100 +++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/03_print_async.patch 2012-10-26 18:51:44.000000000 +0200 @@ -0,0 +1,209 @@ +From f2da010bb2423ff8d797306d7b0bdcd6f33c93f8 Mon Sep 17 00:00:00 2001 +From: Marek Kasik <mka...@redhat.com> +Date: Tue, 26 Jun 2012 12:04:29 +0000 +Subject: print-notifications: Perform async connection tests to CUPS during start + +Perform asynchronous connection tests before getting destinations +from CUPS server and before creating a subscription for CUPS +messages (#677081). +--- +diff --git a/plugins/print-notifications/gsd-print-notifications-manager.c b/plugins/print-notifications/gsd-print-notifications-manager.c +index 33e6452..0092865 100644 +--- a/plugins/print-notifications/gsd-print-notifications-manager.c ++++ b/plugins/print-notifications/gsd-print-notifications-manager.c +@@ -47,10 +47,11 @@ + #define CUPS_DBUS_PATH "/org/cups/cupsd/Notifier" + #define CUPS_DBUS_INTERFACE "org.cups.cupsd.Notifier" + +-#define RENEW_INTERVAL 3500 +-#define SUBSCRIPTION_DURATION 3600 +-#define CONNECTING_TIMEOUT 60 +-#define REASON_TIMEOUT 15000 ++#define RENEW_INTERVAL 3500 ++#define SUBSCRIPTION_DURATION 3600 ++#define CONNECTING_TIMEOUT 60 ++#define REASON_TIMEOUT 15000 ++#define CUPS_CONNECTION_TEST_INTERVAL 300 + + struct GsdPrintNotificationsManagerPrivate + { +@@ -63,6 +64,7 @@ struct GsdPrintNotificationsManagerPrivate + GList *timeouts; + GHashTable *printing_printers; + GList *active_notifications; ++ guint cups_connection_timeout_id; + }; + + enum { +@@ -72,6 +74,7 @@ enum { + static void gsd_print_notifications_manager_class_init (GsdPrintNotificationsManagerClass *klass); + static void gsd_print_notifications_manager_init (GsdPrintNotificationsManager *print_notifications_manager); + static void gsd_print_notifications_manager_finalize (GObject *object); ++static gboolean cups_connection_test (gpointer user_data); + + G_DEFINE_TYPE (GsdPrintNotificationsManager, gsd_print_notifications_manager, G_TYPE_OBJECT) + +@@ -904,6 +907,140 @@ renew_subscription (gpointer data) + return TRUE; + } + ++static void ++renew_subscription_with_connection_test_cb (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ GSocketConnection *connection; ++ GError *error = NULL; ++ ++ connection = g_socket_client_connect_to_host_finish (G_SOCKET_CLIENT (source_object), ++ res, ++ &error); ++ ++ if (connection) { ++ g_debug ("Test connection to CUPS server \'%s:%d\' succeeded.", cupsServer (), ippPort ()); ++ ++ g_io_stream_close (G_IO_STREAM (connection), NULL, NULL); ++ g_object_unref (connection); ++ ++ renew_subscription (user_data); ++ } ++ else { ++ g_debug ("Test connection to CUPS server \'%s:%d\' failed.", cupsServer (), ippPort ()); ++ } ++} ++ ++static gboolean ++renew_subscription_with_connection_test (gpointer user_data) ++{ ++ GSocketClient *client; ++ gchar *address; ++ ++ address = g_strdup_printf ("%s:%d", cupsServer (), ippPort ()); ++ ++ if (address && address[0] != '/') { ++ client = g_socket_client_new (); ++ ++ g_debug ("Initiating test connection to CUPS server \'%s:%d\'.", cupsServer (), ippPort ()); ++ ++ g_socket_client_connect_to_host_async (client, ++ address, ++ 631, ++ NULL, ++ renew_subscription_with_connection_test_cb, ++ user_data); ++ ++ g_object_unref (client); ++ } ++ else { ++ renew_subscription (user_data); ++ } ++ ++ g_free (address); ++ ++ return TRUE; ++} ++ ++static void ++cups_connection_test_cb (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ GsdPrintNotificationsManager *manager = (GsdPrintNotificationsManager *) user_data; ++ GSocketConnection *connection; ++ GError *error = NULL; ++ ++ connection = g_socket_client_connect_to_host_finish (G_SOCKET_CLIENT (source_object), ++ res, ++ &error); ++ ++ if (connection) { ++ g_debug ("Test connection to CUPS server \'%s:%d\' succeeded.", cupsServer (), ippPort ()); ++ ++ g_io_stream_close (G_IO_STREAM (connection), NULL, NULL); ++ g_object_unref (connection); ++ ++ manager->priv->num_dests = cupsGetDests (&manager->priv->dests); ++ gnome_settings_profile_msg ("got dests"); ++ ++ renew_subscription (user_data); ++ g_timeout_add_seconds (RENEW_INTERVAL, renew_subscription_with_connection_test, manager); ++ } ++ else { ++ g_debug ("Test connection to CUPS server \'%s:%d\' failed.", cupsServer (), ippPort ()); ++ if (manager->priv->cups_connection_timeout_id == 0) ++ manager->priv->cups_connection_timeout_id = ++ g_timeout_add_seconds (CUPS_CONNECTION_TEST_INTERVAL, cups_connection_test, manager); ++ } ++} ++ ++static gboolean ++cups_connection_test (gpointer user_data) ++{ ++ GsdPrintNotificationsManager *manager = (GsdPrintNotificationsManager *) user_data; ++ GSocketClient *client; ++ gchar *address; ++ ++ if (!manager->priv->dests) { ++ address = g_strdup_printf ("%s:%d", cupsServer (), ippPort ()); ++ ++ if (address && address[0] != '/') { ++ client = g_socket_client_new (); ++ ++ g_debug ("Initiating test connection to CUPS server \'%s:%d\'.", cupsServer (), ippPort ()); ++ ++ g_socket_client_connect_to_host_async (client, ++ address, ++ 631, ++ NULL, ++ cups_connection_test_cb, ++ manager); ++ ++ g_object_unref (client); ++ } ++ else { ++ manager->priv->num_dests = cupsGetDests (&manager->priv->dests); ++ gnome_settings_profile_msg ("got dests"); ++ ++ renew_subscription (user_data); ++ g_timeout_add_seconds (RENEW_INTERVAL, renew_subscription_with_connection_test, manager); ++ } ++ ++ g_free (address); ++ } ++ ++ if (manager->priv->dests) { ++ manager->priv->cups_connection_timeout_id = 0; ++ ++ return FALSE; ++ } ++ else { ++ return TRUE; ++ } ++} ++ + static gboolean + gsd_print_notifications_manager_start_idle (gpointer data) + { +@@ -913,11 +1050,7 @@ gsd_print_notifications_manager_start_idle (gpointer data) + + manager->priv->printing_printers = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + +- renew_subscription (manager); +- g_timeout_add_seconds (RENEW_INTERVAL, renew_subscription, manager); +- +- manager->priv->num_dests = cupsGetDests (&manager->priv->dests); +- gnome_settings_profile_msg ("got dests"); ++ cups_connection_test (manager); + + manager->priv->cups_bus_connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL); + +@@ -955,6 +1088,7 @@ gsd_print_notifications_manager_start (GsdPrintNotificationsManager *manager, + manager->priv->printing_printers = NULL; + manager->priv->active_notifications = NULL; + manager->priv->cups_bus_connection = NULL; ++ manager->priv->cups_connection_timeout_id = 0; + + g_idle_add (gsd_print_notifications_manager_start_idle, manager); + +-- +cgit v0.9.0.2 diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/11_numlock_loop.patch gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/11_numlock_loop.patch --- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/11_numlock_loop.patch 1970-01-01 01:00:00.000000000 +0100 +++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/11_numlock_loop.patch 2012-10-26 19:04:58.000000000 +0200 @@ -0,0 +1,82 @@ +commit 82c7fcf7fd4fe43e73ea5ce6408c79d35ec3dfb8 +Author: Andrew Potter <agpot...@gmail.com> +Date: Wed Oct 24 13:52:09 2012 -0700 + + keyboard: Prevent potential infinite loop + + Ensure we don't set the numlock setting in response to our own + numlock-setting event. + + https://bugzilla.gnome.org/show_bug.cgi?id=679151 + +diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c +index a33460c..1519510 100644 +--- a/plugins/keyboard/gsd-keyboard-manager.c ++++ b/plugins/keyboard/gsd-keyboard-manager.c +@@ -73,6 +73,7 @@ struct GsdKeyboardManagerPrivate + gboolean have_xkb; + gint xkb_event_base; + GsdNumLockState old_state; ++ gulong numlock_serial; + }; + + static void gsd_keyboard_manager_class_init (GsdKeyboardManagerClass *klass); +@@ -128,13 +129,15 @@ numlock_NumLock_modifier_mask (void) + } + + static void +-numlock_set_xkb_state (GsdNumLockState new_state) ++numlock_set_xkb_state (GsdKeyboardManager *manager) + { + unsigned int num_mask; + Display *dpy = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); ++ GsdNumLockState new_state = manager->priv->old_state; + if (new_state != GSD_NUM_LOCK_STATE_ON && new_state != GSD_NUM_LOCK_STATE_OFF) + return; + num_mask = numlock_NumLock_modifier_mask (); ++ manager->priv->numlock_serial = NextRequest(dpy); + XkbLockModifiers (dpy, XkbUseCoreKbd, num_mask, new_state == GSD_NUM_LOCK_STATE_ON ? num_mask : 0); + } + +@@ -156,16 +159,18 @@ numlock_xkb_callback (GdkXEvent *xev_, + if (xkbev->state.changed & XkbModifierLockMask) { + unsigned num_mask = numlock_NumLock_modifier_mask (); + unsigned locked_mods = xkbev->state.locked_mods; ++ unsigned long serial = xkbev->state.serial; + GsdNumLockState numlock_state; + + numlock_state = (num_mask & locked_mods) ? GSD_NUM_LOCK_STATE_ON : GSD_NUM_LOCK_STATE_OFF; + +- if (numlock_state != manager->priv->old_state) { +- g_settings_set_enum (manager->priv->settings, +- KEY_NUMLOCK_STATE, +- numlock_state); +- manager->priv->old_state = numlock_state; +- } ++ if (numlock_state != manager->priv->old_state ++ && serial > manager->priv->numlock_serial) { ++ g_settings_set_enum (manager->priv->settings, ++ KEY_NUMLOCK_STATE, ++ numlock_state); ++ manager->priv->old_state = numlock_state; ++ } + } + + return GDK_FILTER_CONTINUE; +@@ -254,7 +259,7 @@ apply_settings (GSettings *settings, + manager->priv->old_state = g_settings_get_enum (manager->priv->settings, KEY_NUMLOCK_STATE); + + if (manager->priv->have_xkb && rnumlock) +- numlock_set_xkb_state (manager->priv->old_state); ++ numlock_set_xkb_state (manager); + + XSync (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), FALSE); + gdk_error_trap_pop_ignored (); +@@ -359,6 +364,7 @@ static void + gsd_keyboard_manager_init (GsdKeyboardManager *manager) + { + manager->priv = GSD_KEYBOARD_MANAGER_GET_PRIVATE (manager); ++ manager->priv->numlock_serial = G_MAXULONG; + } + + static void diff -Nru gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/series gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/series --- gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/series 2012-09-29 13:12:40.000000000 +0200 +++ gnome-settings-daemon-3.4.2+git20120925.a4c817/debian/patches/series 2012-10-26 19:04:58.000000000 +0200 @@ -1,5 +1,9 @@ +01_print_proxy.patch +02_print_init.patch +03_print_async.patch 04_superP.patch 10_smaller_syndaemon_timeout.patch +11_numlock_loop.patch power-check-null-devices.patch power-ignore-bad-dbus-requests.patch revert_git_datetime_dropping.patch