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