summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@jhu.edu>2007-04-20 17:56:40 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2007-04-20 17:56:40 +0000
commit373f1c11da7b8855401c3474e084c94c41ebe229 (patch)
treee15c72136e1fc3292d90493aaa264cfdda48157d
parent6ab7023e31b1625e3f7b6b0c9afdca387ea1ce9d (diff)
downloadgdm-373f1c11da7b8855401c3474e084c94c41ebe229.tar.gz
Fix detection of user specified in flexi command.
2007-04-20 William Jon McCann <mccann@jhu.edu> * daemon/gdm.c: (handle_flexi_server), (handle_dynamic_server), (sup_handle_flexi_xserver), (sup_handle_flexi_xnest), (sup_handle_set_logout_action), (sup_handle_set_safe_logout_action), (sup_handle_query_vt), (sup_handle_set_vt): Fix detection of user specified in flexi command. * gui/gdmflexiserver.c: (get_cur_vt), (change_vt), (maybe_lock_screen): Fix a double free. svn path=/trunk/; revision=4847
-rw-r--r--ChangeLog13
-rw-r--r--daemon/gdm.c100
-rw-r--r--gui/gdmflexiserver.c34
3 files changed, 97 insertions, 50 deletions
diff --git a/ChangeLog b/ChangeLog
index ab98a04c..5bfaddc7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
2007-04-20 William Jon McCann <mccann@jhu.edu>
+ * daemon/gdm.c: (handle_flexi_server), (handle_dynamic_server),
+ (sup_handle_flexi_xserver), (sup_handle_flexi_xnest),
+ (sup_handle_set_logout_action),
+ (sup_handle_set_safe_logout_action), (sup_handle_query_vt),
+ (sup_handle_set_vt):
+ Fix detection of user specified in flexi command.
+
+ * gui/gdmflexiserver.c: (get_cur_vt), (change_vt),
+ (maybe_lock_screen):
+ Fix a double free.
+
+2007-04-20 William Jon McCann <mccann@jhu.edu>
+
* gui/gdmflexiserver.c: (maybe_lock_screen), (main):
Properly initialize gtk. Fixes #431044
diff --git a/daemon/gdm.c b/daemon/gdm.c
index 1e969228..b6d73a03 100644
--- a/daemon/gdm.c
+++ b/daemon/gdm.c
@@ -2986,21 +2986,21 @@ check_cookie (const gchar *file, const gchar *disp, const gchar *cookie)
static void
handle_flexi_server (GdmConnection *conn,
- int type,
- const gchar *server,
- gboolean handled,
- gboolean chooser,
- const gchar *xnest_disp,
- uid_t xnest_uid,
- const gchar *xnest_auth_file,
- const gchar *xnest_cookie,
- const gchar *username)
+ int type,
+ const char *server,
+ gboolean handled,
+ gboolean chooser,
+ const char *xnest_disp,
+ uid_t xnest_uid,
+ const char *xnest_auth_file,
+ const char *xnest_cookie,
+ const char *username)
{
GdmDisplay *display;
gchar *bin;
uid_t server_uid = 0;
- g_debug ("server: '%s'", server);
+ g_debug ("flexi server: '%s'", server);
if (gdm_wait_for_go) {
if (conn != NULL)
@@ -3053,7 +3053,7 @@ handle_flexi_server (GdmConnection *conn,
/* this must always work, thus the asserts */
NEVER_FAILS_root_set_euid_egid (0, oldgid);
- if ( ! authorized) {
+ if (! authorized) {
/* Sorry dude, you're not doing something
* right */
if (conn != NULL)
@@ -3186,12 +3186,12 @@ handle_dynamic_server (GdmConnection *conn, int type, gchar *key)
}
full = strchr (key, '=');
- if (full == NULL || *(full+1) == 0) {
+ if (full == NULL || *(full + 1) == 0) {
gdm_connection_write (conn, "ERROR 3 No server string\n");
return;
}
- val = full+1;
+ val = full + 1;
disp = gdm_server_alloc (disp_num, val);
if (disp == NULL) {
@@ -3433,17 +3433,20 @@ sup_handle_flexi_xserver (GdmConnection *conn,
const char *msg,
gpointer data)
{
- gchar *name;
- const gchar *command = NULL;
+ char *name;
+ const char *command = NULL;
GdmXserver *svr;
- const gchar *rest;
- gchar *username, *end;
- gboolean has_user;
+ const char *rest;
+ char *username;
+ char *end;
+ gboolean has_user;
has_user = strncmp (msg, GDM_SUP_FLEXI_XSERVER_USER " ", strlen (GDM_SUP_FLEXI_XSERVER_USER " ")) == 0;
+ g_debug ("Handling flexi request has-user:%d", has_user);
+
/* Only allow locally authenticated connections */
- if ( ! GDM_CONN_AUTHENTICATED(conn)) {
+ if ( ! GDM_CONN_AUTHENTICATED (conn)) {
gdm_info (_("%s request denied: "
"Not authenticated"), "FLEXI_XSERVER");
gdm_connection_write (conn,
@@ -3451,7 +3454,7 @@ sup_handle_flexi_xserver (GdmConnection *conn,
return;
}
- if (has_user == 0) {
+ if (has_user) {
rest = msg + strlen (GDM_SUP_FLEXI_XSERVER_USER " ");
end = strchr (rest, ' ');
if (end) {
@@ -3465,6 +3468,7 @@ sup_handle_flexi_xserver (GdmConnection *conn,
rest = msg + strlen (GDM_SUP_FLEXI_XSERVER " ");
username = NULL;
}
+
name = g_strdup (rest);
g_strstrip (name);
if (ve_string_empty (name)) {
@@ -3473,6 +3477,7 @@ sup_handle_flexi_xserver (GdmConnection *conn,
}
svr = gdm_daemon_config_find_xserver (name);
+
if G_UNLIKELY (svr == NULL) {
/* Don't print the name to syslog as it might be
* long and dangerous */
@@ -3489,13 +3494,19 @@ sup_handle_flexi_xserver (GdmConnection *conn,
}
g_free (name);
- handle_flexi_server (conn, TYPE_FLEXI, command,
+ handle_flexi_server (conn,
+ TYPE_FLEXI,
+ command,
/* It is kind of ugly that we don't use
the standard resolution for this, but
oh well, this makes other things simpler */
svr->handled,
svr->chooser,
- NULL, 0, NULL, NULL, username);
+ NULL,
+ 0,
+ NULL,
+ NULL,
+ username);
g_free (username);
}
@@ -3504,17 +3515,20 @@ sup_handle_flexi_xnest (GdmConnection *conn,
const char *msg,
gpointer data)
{
- gchar *dispname = NULL;
- char *xauthfile = NULL;
- char *cookie = NULL;
- uid_t uid;
- const gchar *rest;
- gchar *username, *end;
- gboolean has_user;
+ char *dispname = NULL;
+ char *xauthfile = NULL;
+ char *cookie = NULL;
+ uid_t uid;
+ const char *rest;
+ char *username;
+ char *end;
+ gboolean has_user;
has_user = strncmp (msg, GDM_SUP_FLEXI_XNEST_USER " ", strlen (GDM_SUP_FLEXI_XNEST_USER " ")) == 0;
- if (has_user == 0) {
+ g_debug ("Handling flexi xnest request has-user:%d", has_user);
+
+ if (has_user) {
rest = msg + strlen (GDM_SUP_FLEXI_XNEST_USER " ");
end = strchr (rest, ' ');
username = g_strndup (rest, end - rest);
@@ -3523,14 +3537,18 @@ sup_handle_flexi_xnest (GdmConnection *conn,
username = NULL;
}
- extract_dispname_uid_xauthfile_cookie (rest, &dispname, &uid,
- &xauthfile, &cookie);
+ extract_dispname_uid_xauthfile_cookie (rest,
+ &dispname,
+ &uid,
+ &xauthfile,
+ &cookie);
if (dispname == NULL) {
/* Something bogus is going on, so just whack the
* connection */
g_free (xauthfile);
gdm_connection_close (conn);
+ g_warning ("Unable to get display name from request");
return;
}
@@ -3544,10 +3562,16 @@ sup_handle_flexi_xnest (GdmConnection *conn,
return;
}
- handle_flexi_server (conn, TYPE_FLEXI_XNEST, gdm_daemon_config_get_value_string (GDM_KEY_XNEST),
+ handle_flexi_server (conn,
+ TYPE_FLEXI_XNEST,
+ gdm_daemon_config_get_value_string (GDM_KEY_XNEST),
TRUE /* handled */,
FALSE /* chooser */,
- dispname, uid, xauthfile, cookie, username);
+ dispname,
+ uid,
+ xauthfile,
+ cookie,
+ username);
g_free (dispname);
g_free (xauthfile);
@@ -3941,7 +3965,7 @@ sup_handle_set_logout_action (GdmConnection *conn,
disp = gdm_connection_get_display (conn);
/* Only allow locally authenticated connections */
- if ( ! GDM_CONN_AUTHENTICATED(conn) ||
+ if ( ! GDM_CONN_AUTHENTICATED (conn) ||
disp == NULL ||
! disp->logged_in) {
gdm_info (_("%s request denied: "
@@ -4009,7 +4033,7 @@ sup_handle_set_safe_logout_action (GdmConnection *conn,
disp = gdm_connection_get_display (conn);
/* Only allow locally authenticated connections */
- if ( ! GDM_CONN_AUTHENTICATED(conn) ||
+ if ( ! GDM_CONN_AUTHENTICATED (conn) ||
disp == NULL ||
! disp->logged_in) {
gdm_info (_("%s request denied: "
@@ -4073,7 +4097,7 @@ sup_handle_query_vt (GdmConnection *conn,
{
/* Only allow locally authenticated connections */
- if ( ! GDM_CONN_AUTHENTICATED(conn)) {
+ if ( ! GDM_CONN_AUTHENTICATED (conn)) {
gdm_info (_("%s request denied: "
"Not authenticated"), "QUERY_VT");
gdm_connection_write (conn,
@@ -4107,7 +4131,7 @@ sup_handle_set_vt (GdmConnection *conn,
}
/* Only allow locally authenticated connections */
- if ( ! GDM_CONN_AUTHENTICATED(conn)) {
+ if ( ! GDM_CONN_AUTHENTICATED (conn)) {
gdm_info (_("%s request denied: "
"Not authenticated"), "QUERY_VT");
gdm_connection_write (conn,
diff --git a/gui/gdmflexiserver.c b/gui/gdmflexiserver.c
index da33c4c5..5d72da25 100644
--- a/gui/gdmflexiserver.c
+++ b/gui/gdmflexiserver.c
@@ -79,24 +79,32 @@ GOptionEntry options [] = {
static int
get_cur_vt (void)
{
- char *ret;
- static int cur_vt;
+ char *result;
+ static int cur_vt;
static gboolean checked = FALSE;
+ int ret;
+
+ result = NULL;
+ ret = -1;
- if (checked)
+ if (checked) {
return cur_vt;
+ }
ret = gdmcomm_call_gdm ("QUERY_VT", auth_cookie, "2.5.90.0", 5);
- if (ve_string_empty (ret) ||
- strncmp (ret, "OK ", 3) != 0) {
- g_free (ret);
- return -1;
+ if (ve_string_empty (ret) || strncmp (ret, "OK ", 3) != 0) {
+ goto out;
}
- if (sscanf (ret, "OK %d", &cur_vt) != 1)
+ if (sscanf (ret, "OK %d", &cur_vt) != 1) {
cur_vt = -1;
- g_free (ret);
+ }
+
checked = TRUE;
+
+ out:
+ g_free (result);
+
return cur_vt;
}
@@ -132,9 +140,11 @@ change_vt (int vt)
{
char *cmd;
char *ret;
+
cmd = g_strdup_printf (GDM_SUP_SET_VT " %d", vt);
ret = gdmcomm_call_gdm (cmd, auth_cookie, "2.5.90.0", 5);
g_free (cmd);
+
if (ve_string_empty (ret) ||
strcmp (ret, "OK") != 0) {
GtkWidget *dialog;
@@ -390,15 +400,15 @@ maybe_lock_screen (void)
g_free (command);
- if (!use_gscreensaver) {
+ if (! use_gscreensaver) {
command = g_strdup ("xscreensaver-command -throttle");
if (! gdk_spawn_command_line_on_screen (screen, command, &error)) {
g_warning ("Cannot disable screensaver engines: %s", error->message);
g_error_free (error);
}
- }
- g_free (command);
+ g_free (command);
+ }
}
static void