From 7338a1c2ecf5a8cc1fc249afebf8d58e3d57bed8 Mon Sep 17 00:00:00 2001 From: Ray Strode 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 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