Blob Blame History Raw
From 7338a1c2ecf5a8cc1fc249afebf8d58e3d57bed8 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 3 Feb 2014 15:46:28 -0500
Subject: [PATCH] slave: fail gracefully when fed an invalid display id

---
 daemon/gdm-slave.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index e5c8be7..fef500e 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -647,101 +647,101 @@ gdm_slave_connect_to_x11_display (GdmSlave *slave)
 
         return ret;
 }
 
 static gboolean
 gdm_slave_set_slave_bus_name (GdmSlave *slave)
 {
         gboolean    res;
         GError     *error;
         const char *name;
 
         name = g_dbus_connection_get_unique_name (slave->priv->connection);
 
         error = NULL;
         res = gdm_dbus_display_call_set_slave_bus_name_sync (slave->priv->display_proxy,
                                                              name,
                                                              NULL,
                                                              &error);
         if (! res) {
                 g_warning ("Failed to set slave bus name on parent: %s", error->message);
                 g_error_free (error);
         }
 
         return res;
 }
 
 static gboolean
 gdm_slave_real_start (GdmSlave *slave)
 {
         gboolean    res;
-        char       *id;
+        char       *id = NULL;
         GError     *error;
         GVariant   *x11_cookie;
         const char *x11_cookie_bytes;
         gsize       x11_cookie_size;
 
         g_debug ("GdmSlave: Starting slave");
 
         g_assert (slave->priv->display_proxy == NULL);
 
         g_debug ("GdmSlave: Creating proxy for %s", slave->priv->display_id);
         error = NULL;
         slave->priv->display_proxy = GDM_DBUS_DISPLAY (gdm_dbus_display_proxy_new_sync (slave->priv->connection,
                                                                                         G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
                                                                                         GDM_DBUS_NAME,
                                                                                         slave->priv->display_id,
                                                                                         NULL,
                                                                                         &error));
 
         if (slave->priv->display_proxy == NULL) {
                 g_warning ("Failed to create display proxy %s: %s", slave->priv->display_id, error->message);
                 g_error_free (error);
                 return FALSE;
         }
 
         error = NULL;
         res = gdm_dbus_display_call_get_id_sync (slave->priv->display_proxy,
                                                  &id,
                                                  NULL,
                                                  &error);
-        if (! res) {
+        if (! res || !id) {
                 g_warning ("Failed to get display ID %s: %s", slave->priv->display_id, error->message);
                 g_error_free (error);
                 return FALSE;
         }
 
         g_debug ("GdmSlave: Got display ID: %s", id);
 
         if (strcmp (id, slave->priv->display_id) != 0) {
-                g_critical ("Display ID doesn't match");
-                exit (1);
+                g_warning ("Display ID doesn't match");
+                return FALSE;
         }
 
         gdm_slave_set_slave_bus_name (slave);
 
         /* cache some values up front */
         error = NULL;
         res = gdm_dbus_display_call_is_local_sync (slave->priv->display_proxy,
                                                    &slave->priv->display_is_local,
                                                    NULL,
                                                    &error);
         if (! res) {
                 g_warning ("Failed to get value: %s", error->message);
                 g_error_free (error);
                 return FALSE;
         }
 
         error = NULL;
         res = gdm_dbus_display_call_get_x11_display_name_sync (slave->priv->display_proxy,
                                                                &slave->priv->display_name,
                                                                NULL,
                                                                &error);
         if (! res) {
                 g_warning ("Failed to get value: %s", error->message);
                 g_error_free (error);
                 return FALSE;
         }
 
         error = NULL;
         res = gdm_dbus_display_call_get_x11_display_number_sync (slave->priv->display_proxy,
                                                                  &slave->priv->display_number,
-- 
1.8.3.1

From 21faeec37dd0e8b04c92aea3c1bdf9b9fcaab91c Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 3 Feb 2014 16:00:50 -0500
Subject: [PATCH] slave: check object path validity before creating proxy from
 it

This prevents a crash if the admin runs

/usr/libexec/gdm-simple-slave --display-id something-invalid
---
 daemon/gdm-slave.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index fef500e..fd7ca81 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -657,60 +657,65 @@ gdm_slave_set_slave_bus_name (GdmSlave *slave)
 
         name = g_dbus_connection_get_unique_name (slave->priv->connection);
 
         error = NULL;
         res = gdm_dbus_display_call_set_slave_bus_name_sync (slave->priv->display_proxy,
                                                              name,
                                                              NULL,
                                                              &error);
         if (! res) {
                 g_warning ("Failed to set slave bus name on parent: %s", error->message);
                 g_error_free (error);
         }
 
         return res;
 }
 
 static gboolean
 gdm_slave_real_start (GdmSlave *slave)
 {
         gboolean    res;
         char       *id = NULL;
         GError     *error;
         GVariant   *x11_cookie;
         const char *x11_cookie_bytes;
         gsize       x11_cookie_size;
 
         g_debug ("GdmSlave: Starting slave");
 
         g_assert (slave->priv->display_proxy == NULL);
 
+        if (! g_variant_is_object_path (slave->priv->display_id)) {
+                g_warning ("Display ID isn't valid");
+                return FALSE;
+        }
+
         g_debug ("GdmSlave: Creating proxy for %s", slave->priv->display_id);
         error = NULL;
         slave->priv->display_proxy = GDM_DBUS_DISPLAY (gdm_dbus_display_proxy_new_sync (slave->priv->connection,
                                                                                         G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
                                                                                         GDM_DBUS_NAME,
                                                                                         slave->priv->display_id,
                                                                                         NULL,
                                                                                         &error));
 
         if (slave->priv->display_proxy == NULL) {
                 g_warning ("Failed to create display proxy %s: %s", slave->priv->display_id, error->message);
                 g_error_free (error);
                 return FALSE;
         }
 
         error = NULL;
         res = gdm_dbus_display_call_get_id_sync (slave->priv->display_proxy,
                                                  &id,
                                                  NULL,
                                                  &error);
         if (! res || !id) {
                 g_warning ("Failed to get display ID %s: %s", slave->priv->display_id, error->message);
                 g_error_free (error);
                 return FALSE;
         }
 
         g_debug ("GdmSlave: Got display ID: %s", id);
 
         if (strcmp (id, slave->priv->display_id) != 0) {
                 g_warning ("Display ID doesn't match");
-- 
1.8.3.1