[gnome-control-center] user-accounts: Avoid a crash when gdm's schemas aren't installed



commit 958c0140bbc3e9094c29d85bb088956e7e70ba39
Author: Rui Matos <tiagomatos gmail com>
Date:   Mon Sep 7 15:38:07 2015 +0200

    user-accounts: Avoid a crash when gdm's schemas aren't installed
    
    Commit de821d592294de94659b316792a1395fd08352bb implicitly added a
    runtime dependency on gdm's settings schemas being installed. Since
    GSettings aborts if schemas aren't installed this means we new crash
    on systems without gdm.
    
    See https://bugzilla.redhat.com/show_bug.cgi?id=1259935 .
    
    https://bugzilla.gnome.org/show_bug.cgi?id=754682

 panels/user-accounts/um-user-panel.c |   28 ++++++++++++++++++++++++++--
 1 files changed, 26 insertions(+), 2 deletions(-)
---
diff --git a/panels/user-accounts/um-user-panel.c b/panels/user-accounts/um-user-panel.c
index e2d164c..f534745 100644
--- a/panels/user-accounts/um-user-panel.c
+++ b/panels/user-accounts/um-user-panel.c
@@ -928,7 +928,8 @@ show_user (ActUser *user, CcUserPanelPrivate *d)
         label = get_widget (d, "account-fingerprint-label");
         show = (act_user_get_uid (user) == getuid() &&
                 act_user_is_local_account (user) &&
-                g_settings_get_boolean (d->login_screen_settings, "enable-fingerprint-authentication") &&
+                (d->login_screen_settings &&
+                 g_settings_get_boolean (d->login_screen_settings, "enable-fingerprint-authentication")) &&
                 set_fingerprint_label (widget));
         gtk_widget_set_visible (label, show);
         gtk_widget_set_visible (widget, show);
@@ -1692,6 +1693,29 @@ setup_main_window (CcUserPanel *self)
                 g_signal_connect (d->um, "notify::is-loaded", G_CALLBACK (users_loaded), d);
 }
 
+static GSettings *
+settings_or_null (const gchar *schema)
+{
+        GSettingsSchemaSource *source = NULL;
+        gchar **non_relocatable = NULL;
+        gchar **relocatable = NULL;
+        GSettings *settings = NULL;
+
+        source = g_settings_schema_source_get_default ();
+        if (!source)
+                return NULL;
+
+        g_settings_schema_source_list_schemas (source, TRUE, &non_relocatable, &relocatable);
+
+        if (g_strv_contains ((const gchar * const *)non_relocatable, schema) ||
+            g_strv_contains ((const gchar * const *)relocatable, schema))
+                settings = g_settings_new (schema);
+
+        g_strfreev (non_relocatable);
+        g_strfreev (relocatable);
+        return settings;
+}
+
 static void
 cc_user_panel_init (CcUserPanel *self)
 {
@@ -1726,7 +1750,7 @@ cc_user_panel_init (CcUserPanel *self)
                 return;
         }
 
-        d->login_screen_settings = g_settings_new ("org.gnome.login-screen");
+        d->login_screen_settings = settings_or_null ("org.gnome.login-screen");
 
         d->password_dialog = um_password_dialog_new ();
         button = get_widget (d, "user-icon-button");


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]