diff options
author | William Jon McCann <mccann@jhu.edu> | 2007-04-20 17:56:40 +0000 |
---|---|---|
committer | William Jon McCann <mccann@src.gnome.org> | 2007-04-20 17:56:40 +0000 |
commit | 373f1c11da7b8855401c3474e084c94c41ebe229 (patch) | |
tree | e15c72136e1fc3292d90493aaa264cfdda48157d | |
parent | 6ab7023e31b1625e3f7b6b0c9afdca387ea1ce9d (diff) | |
download | gdm-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-- | ChangeLog | 13 | ||||
-rw-r--r-- | daemon/gdm.c | 100 | ||||
-rw-r--r-- | gui/gdmflexiserver.c | 34 |
3 files changed, 97 insertions, 50 deletions
@@ -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 |