|
|
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 |
|