Blame SOURCES/fail-gracefully.patch

01018b
From 7338a1c2ecf5a8cc1fc249afebf8d58e3d57bed8 Mon Sep 17 00:00:00 2001
01018b
From: Ray Strode <rstrode@redhat.com>
01018b
Date: Mon, 3 Feb 2014 15:46:28 -0500
01018b
Subject: [PATCH] slave: fail gracefully when fed an invalid display id
01018b
01018b
---
01018b
 daemon/gdm-slave.c | 8 ++++----
01018b
 1 file changed, 4 insertions(+), 4 deletions(-)
01018b
01018b
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
01018b
index e5c8be7..fef500e 100644
01018b
--- a/daemon/gdm-slave.c
01018b
+++ b/daemon/gdm-slave.c
01018b
@@ -647,101 +647,101 @@ gdm_slave_connect_to_x11_display (GdmSlave *slave)
01018b
 
01018b
         return ret;
01018b
 }
01018b
 
01018b
 static gboolean
01018b
 gdm_slave_set_slave_bus_name (GdmSlave *slave)
01018b
 {
01018b
         gboolean    res;
01018b
         GError     *error;
01018b
         const char *name;
01018b
 
01018b
         name = g_dbus_connection_get_unique_name (slave->priv->connection);
01018b
 
01018b
         error = NULL;
01018b
         res = gdm_dbus_display_call_set_slave_bus_name_sync (slave->priv->display_proxy,
01018b
                                                              name,
01018b
                                                              NULL,
01018b
                                                              &error);
01018b
         if (! res) {
01018b
                 g_warning ("Failed to set slave bus name on parent: %s", error->message);
01018b
                 g_error_free (error);
01018b
         }
01018b
 
01018b
         return res;
01018b
 }
01018b
 
01018b
 static gboolean
01018b
 gdm_slave_real_start (GdmSlave *slave)
01018b
 {
01018b
         gboolean    res;
01018b
-        char       *id;
01018b
+        char       *id = NULL;
01018b
         GError     *error;
01018b
         GVariant   *x11_cookie;
01018b
         const char *x11_cookie_bytes;
01018b
         gsize       x11_cookie_size;
01018b
 
01018b
         g_debug ("GdmSlave: Starting slave");
01018b
 
01018b
         g_assert (slave->priv->display_proxy == NULL);
01018b
 
01018b
         g_debug ("GdmSlave: Creating proxy for %s", slave->priv->display_id);
01018b
         error = NULL;
01018b
         slave->priv->display_proxy = GDM_DBUS_DISPLAY (gdm_dbus_display_proxy_new_sync (slave->priv->connection,
01018b
                                                                                         G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
01018b
                                                                                         GDM_DBUS_NAME,
01018b
                                                                                         slave->priv->display_id,
01018b
                                                                                         NULL,
01018b
                                                                                         &error));
01018b
 
01018b
         if (slave->priv->display_proxy == NULL) {
01018b
                 g_warning ("Failed to create display proxy %s: %s", slave->priv->display_id, error->message);
01018b
                 g_error_free (error);
01018b
                 return FALSE;
01018b
         }
01018b
 
01018b
         error = NULL;
01018b
         res = gdm_dbus_display_call_get_id_sync (slave->priv->display_proxy,
01018b
                                                  &id,
01018b
                                                  NULL,
01018b
                                                  &error);
01018b
-        if (! res) {
01018b
+        if (! res || !id) {
01018b
                 g_warning ("Failed to get display ID %s: %s", slave->priv->display_id, error->message);
01018b
                 g_error_free (error);
01018b
                 return FALSE;
01018b
         }
01018b
 
01018b
         g_debug ("GdmSlave: Got display ID: %s", id);
01018b
 
01018b
         if (strcmp (id, slave->priv->display_id) != 0) {
01018b
-                g_critical ("Display ID doesn't match");
01018b
-                exit (1);
01018b
+                g_warning ("Display ID doesn't match");
01018b
+                return FALSE;
01018b
         }
01018b
 
01018b
         gdm_slave_set_slave_bus_name (slave);
01018b
 
01018b
         /* cache some values up front */
01018b
         error = NULL;
01018b
         res = gdm_dbus_display_call_is_local_sync (slave->priv->display_proxy,
01018b
                                                    &slave->priv->display_is_local,
01018b
                                                    NULL,
01018b
                                                    &error);
01018b
         if (! res) {
01018b
                 g_warning ("Failed to get value: %s", error->message);
01018b
                 g_error_free (error);
01018b
                 return FALSE;
01018b
         }
01018b
 
01018b
         error = NULL;
01018b
         res = gdm_dbus_display_call_get_x11_display_name_sync (slave->priv->display_proxy,
01018b
                                                                &slave->priv->display_name,
01018b
                                                                NULL,
01018b
                                                                &error);
01018b
         if (! res) {
01018b
                 g_warning ("Failed to get value: %s", error->message);
01018b
                 g_error_free (error);
01018b
                 return FALSE;
01018b
         }
01018b
 
01018b
         error = NULL;
01018b
         res = gdm_dbus_display_call_get_x11_display_number_sync (slave->priv->display_proxy,
01018b
                                                                  &slave->priv->display_number,
01018b
-- 
01018b
1.8.3.1
01018b
01018b
From 21faeec37dd0e8b04c92aea3c1bdf9b9fcaab91c Mon Sep 17 00:00:00 2001
01018b
From: Ray Strode <rstrode@redhat.com>
01018b
Date: Mon, 3 Feb 2014 16:00:50 -0500
01018b
Subject: [PATCH] slave: check object path validity before creating proxy from
01018b
 it
01018b
01018b
This prevents a crash if the admin runs
01018b
01018b
/usr/libexec/gdm-simple-slave --display-id something-invalid
01018b
---
01018b
 daemon/gdm-slave.c | 5 +++++
01018b
 1 file changed, 5 insertions(+)
01018b
01018b
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
01018b
index fef500e..fd7ca81 100644
01018b
--- a/daemon/gdm-slave.c
01018b
+++ b/daemon/gdm-slave.c
01018b
@@ -657,60 +657,65 @@ gdm_slave_set_slave_bus_name (GdmSlave *slave)
01018b
 
01018b
         name = g_dbus_connection_get_unique_name (slave->priv->connection);
01018b
 
01018b
         error = NULL;
01018b
         res = gdm_dbus_display_call_set_slave_bus_name_sync (slave->priv->display_proxy,
01018b
                                                              name,
01018b
                                                              NULL,
01018b
                                                              &error);
01018b
         if (! res) {
01018b
                 g_warning ("Failed to set slave bus name on parent: %s", error->message);
01018b
                 g_error_free (error);
01018b
         }
01018b
 
01018b
         return res;
01018b
 }
01018b
 
01018b
 static gboolean
01018b
 gdm_slave_real_start (GdmSlave *slave)
01018b
 {
01018b
         gboolean    res;
01018b
         char       *id = NULL;
01018b
         GError     *error;
01018b
         GVariant   *x11_cookie;
01018b
         const char *x11_cookie_bytes;
01018b
         gsize       x11_cookie_size;
01018b
 
01018b
         g_debug ("GdmSlave: Starting slave");
01018b
 
01018b
         g_assert (slave->priv->display_proxy == NULL);
01018b
 
01018b
+        if (! g_variant_is_object_path (slave->priv->display_id)) {
01018b
+                g_warning ("Display ID isn't valid");
01018b
+                return FALSE;
01018b
+        }
01018b
+
01018b
         g_debug ("GdmSlave: Creating proxy for %s", slave->priv->display_id);
01018b
         error = NULL;
01018b
         slave->priv->display_proxy = GDM_DBUS_DISPLAY (gdm_dbus_display_proxy_new_sync (slave->priv->connection,
01018b
                                                                                         G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
01018b
                                                                                         GDM_DBUS_NAME,
01018b
                                                                                         slave->priv->display_id,
01018b
                                                                                         NULL,
01018b
                                                                                         &error));
01018b
 
01018b
         if (slave->priv->display_proxy == NULL) {
01018b
                 g_warning ("Failed to create display proxy %s: %s", slave->priv->display_id, error->message);
01018b
                 g_error_free (error);
01018b
                 return FALSE;
01018b
         }
01018b
 
01018b
         error = NULL;
01018b
         res = gdm_dbus_display_call_get_id_sync (slave->priv->display_proxy,
01018b
                                                  &id,
01018b
                                                  NULL,
01018b
                                                  &error);
01018b
         if (! res || !id) {
01018b
                 g_warning ("Failed to get display ID %s: %s", slave->priv->display_id, error->message);
01018b
                 g_error_free (error);
01018b
                 return FALSE;
01018b
         }
01018b
 
01018b
         g_debug ("GdmSlave: Got display ID: %s", id);
01018b
 
01018b
         if (strcmp (id, slave->priv->display_id) != 0) {
01018b
                 g_warning ("Display ID doesn't match");
01018b
-- 
01018b
1.8.3.1
01018b