William Jon McCann 32ed7aa
Index: gdm/daemon/gdm-session-direct.c
William Jon McCann 32ed7aa
===================================================================
William Jon McCann 32ed7aa
--- gdm/daemon/gdm-session-direct.c	(revision 5874)
William Jon McCann 32ed7aa
+++ gdm/daemon/gdm-session-direct.c	(working copy)
William Jon McCann 32ed7aa
@@ -842,6 +842,130 @@ gdm_session_direct_handle_saved_language
William Jon McCann 32ed7aa
         return DBUS_HANDLER_RESULT_HANDLED;
William Jon McCann 32ed7aa
 }
William Jon McCann 32ed7aa
 
William Jon McCann 32ed7aa
+static gboolean
William Jon McCann 32ed7aa
+is_prog_in_path (const char *prog)
William Jon McCann 32ed7aa
+{
William Jon McCann 32ed7aa
+        char    *f;
William Jon McCann 32ed7aa
+        gboolean ret;
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        f = g_find_program_in_path (prog);
William Jon McCann 32ed7aa
+        ret = (f != NULL);
William Jon McCann 32ed7aa
+        g_free (f);
William Jon McCann 32ed7aa
+        return ret;
William Jon McCann 32ed7aa
+}
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+static gboolean
William Jon McCann 32ed7aa
+get_session_command_for_file (const char *file,
William Jon McCann 32ed7aa
+                              char      **command)
William Jon McCann 32ed7aa
+{
William Jon McCann 32ed7aa
+        GKeyFile   *key_file;
William Jon McCann 32ed7aa
+        GError     *error;
William Jon McCann 32ed7aa
+        char       *full_path;
William Jon McCann 32ed7aa
+        char       *exec;
William Jon McCann 32ed7aa
+        gboolean    ret;
William Jon McCann 32ed7aa
+        gboolean    res;
William Jon McCann 32ed7aa
+        const char *search_dirs[] = {
William Jon McCann 32ed7aa
+                "/etc/X11/sessions/",
William Jon McCann 32ed7aa
+                DMCONFDIR "/Sessions/",
William Jon McCann 32ed7aa
+                DATADIR "/gdm/BuiltInSessions/",
William Jon McCann 32ed7aa
+                DATADIR "/xsessions/",
William Jon McCann 32ed7aa
+                NULL
William Jon McCann 32ed7aa
+        };
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        exec = NULL;
William Jon McCann 32ed7aa
+        ret = FALSE;
William Jon McCann 32ed7aa
+        if (command != NULL) {
William Jon McCann 32ed7aa
+                *command = NULL;
William Jon McCann 32ed7aa
+        }
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        key_file = g_key_file_new ();
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        g_debug ("GdmSessionDirect: looking for session file '%s'", file);
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        error = NULL;
William Jon McCann 32ed7aa
+        full_path = NULL;
William Jon McCann 32ed7aa
+        res = g_key_file_load_from_dirs (key_file,
William Jon McCann 32ed7aa
+                                         file,
William Jon McCann 32ed7aa
+                                         search_dirs,
William Jon McCann 32ed7aa
+                                         &full_path,
William Jon McCann 32ed7aa
+                                         G_KEY_FILE_NONE,
William Jon McCann 32ed7aa
+                                         &error);
William Jon McCann 32ed7aa
+        if (! res) {
William Jon McCann 32ed7aa
+                g_debug ("GdmSessionDirect: File '%s' not found: %s", file, error->message);
William Jon McCann 32ed7aa
+                g_error_free (error);
William Jon McCann 32ed7aa
+                if (command != NULL) {
William Jon McCann 32ed7aa
+                        *command = NULL;
William Jon McCann 32ed7aa
+                }
William Jon McCann 32ed7aa
+                goto out;
William Jon McCann 32ed7aa
+        }
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        error = NULL;
William Jon McCann 32ed7aa
+        res = g_key_file_get_boolean (key_file,
William Jon McCann 32ed7aa
+                                      G_KEY_FILE_DESKTOP_GROUP,
William Jon McCann 32ed7aa
+                                      G_KEY_FILE_DESKTOP_KEY_HIDDEN,
William Jon McCann 32ed7aa
+                                      &error);
William Jon McCann 32ed7aa
+        if (error == NULL && res) {
William Jon McCann 32ed7aa
+                g_debug ("GdmSessionDirect: Session %s is marked as hidden", file);
William Jon McCann 32ed7aa
+                goto out;
William Jon McCann 32ed7aa
+        }
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        error = NULL;
William Jon McCann 32ed7aa
+        exec = g_key_file_get_string (key_file,
William Jon McCann 32ed7aa
+                                      G_KEY_FILE_DESKTOP_GROUP,
William Jon McCann 32ed7aa
+                                      G_KEY_FILE_DESKTOP_KEY_TRY_EXEC,
William Jon McCann 32ed7aa
+                                      &error);
William Jon McCann 32ed7aa
+        if (exec == NULL) {
William Jon McCann 32ed7aa
+                g_debug ("GdmSessionDirect: %s key not found", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
William Jon McCann 32ed7aa
+                goto out;
William Jon McCann 32ed7aa
+        }
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        res = is_prog_in_path (exec);
William Jon McCann 32ed7aa
+        g_free (exec);
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        if (! res) {
William Jon McCann 32ed7aa
+                g_debug ("GdmSessionDirect: Command not found: %s", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
William Jon McCann 32ed7aa
+                goto out;
William Jon McCann 32ed7aa
+        }
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        error = NULL;
William Jon McCann 32ed7aa
+        exec = g_key_file_get_string (key_file,
William Jon McCann 32ed7aa
+                                      G_KEY_FILE_DESKTOP_GROUP,
William Jon McCann 32ed7aa
+                                      G_KEY_FILE_DESKTOP_KEY_EXEC,
William Jon McCann 32ed7aa
+                                      &error);
William Jon McCann 32ed7aa
+        if (error != NULL) {
William Jon McCann 32ed7aa
+                g_debug ("GdmSessionDirect: %s key not found: %s",
William Jon McCann 32ed7aa
+                         G_KEY_FILE_DESKTOP_KEY_EXEC,
William Jon McCann 32ed7aa
+                         error->message);
William Jon McCann 32ed7aa
+                g_error_free (error);
William Jon McCann 32ed7aa
+                goto out;
William Jon McCann 32ed7aa
+        }
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        if (command != NULL) {
William Jon McCann 32ed7aa
+                *command = g_strdup (exec);
William Jon McCann 32ed7aa
+        }
William Jon McCann 32ed7aa
+        ret = TRUE;
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+out:
William Jon McCann 32ed7aa
+        g_free (exec);
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        return ret;
William Jon McCann 32ed7aa
+}
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+static gboolean
William Jon McCann 32ed7aa
+get_session_command_for_name (const char *name,
William Jon McCann 32ed7aa
+                              char      **command)
William Jon McCann 32ed7aa
+{
William Jon McCann 32ed7aa
+        gboolean res;
William Jon McCann 32ed7aa
+        char    *filename;
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        filename = g_strdup_printf ("%s.desktop", name);
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        command = NULL;
William Jon McCann 32ed7aa
+        res = get_session_command_for_file (filename, command);
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
+        return res;
William Jon McCann 32ed7aa
+}
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
 static DBusHandlerResult
William Jon McCann 32ed7aa
 gdm_session_direct_handle_saved_session_name_read (GdmSessionDirect *session,
William Jon McCann 32ed7aa
                                                    DBusConnection   *connection,
William Jon McCann 32ed7aa
@@ -862,6 +986,14 @@ gdm_session_direct_handle_saved_session_
William Jon McCann 32ed7aa
         dbus_connection_send (connection, reply, NULL);
William Jon McCann 32ed7aa
         dbus_message_unref (reply);
William Jon McCann 32ed7aa
 
William Jon McCann 32ed7aa
+        if (! get_session_command_for_name (session_name, NULL)) {
William Jon McCann 32ed7aa
+                /* ignore sessions that don't exist */
William Jon McCann 32ed7aa
+                g_debug ("GdmSessionDirect: not using invalid .dmrc session: %s", session_name);
William Jon McCann 32ed7aa
+                g_free (session->priv->saved_session);
William Jon McCann 32ed7aa
+                session->priv->saved_session = NULL;
William Jon McCann 32ed7aa
+                goto out;
William Jon McCann 32ed7aa
+        }
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
         if (strcmp (session_name,
William Jon McCann 32ed7aa
                     get_default_session_name (session)) != 0) {
William Jon McCann 32ed7aa
                 g_free (session->priv->saved_session);
William Jon McCann 32ed7aa
@@ -870,7 +1002,7 @@ gdm_session_direct_handle_saved_session_
William Jon McCann 32ed7aa
                 _gdm_session_default_session_name_changed (GDM_SESSION (session),
William Jon McCann 32ed7aa
                                                            session_name);
William Jon McCann 32ed7aa
         }
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
+ out:
William Jon McCann 32ed7aa
         return DBUS_HANDLER_RESULT_HANDLED;
William Jon McCann 32ed7aa
 }
William Jon McCann 32ed7aa
 
William Jon McCann 32ed7aa
@@ -1603,115 +1735,6 @@ send_environment (GdmSessionDirect *sess
William Jon McCann 32ed7aa
                               session);
William Jon McCann 32ed7aa
 }
William Jon McCann 32ed7aa
 
William Jon McCann 32ed7aa
-static gboolean
William Jon McCann 32ed7aa
-is_prog_in_path (const char *prog)
William Jon McCann 32ed7aa
-{
William Jon McCann 32ed7aa
-        char    *f;
William Jon McCann 32ed7aa
-        gboolean ret;
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-        f = g_find_program_in_path (prog);
William Jon McCann 32ed7aa
-        ret = (f != NULL);
William Jon McCann 32ed7aa
-        g_free (f);
William Jon McCann 32ed7aa
-        return ret;
William Jon McCann 32ed7aa
-}
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-static gboolean
William Jon McCann 32ed7aa
-get_session_command_for_file (const char *file,
William Jon McCann 32ed7aa
-                              char      **command)
William Jon McCann 32ed7aa
-{
William Jon McCann 32ed7aa
-        GKeyFile   *key_file;
William Jon McCann 32ed7aa
-        GError     *error;
William Jon McCann 32ed7aa
-        char       *full_path;
William Jon McCann 32ed7aa
-        char       *exec;
William Jon McCann 32ed7aa
-        gboolean    ret;
William Jon McCann 32ed7aa
-        gboolean    res;
William Jon McCann 32ed7aa
-        const char *search_dirs[] = {
William Jon McCann 32ed7aa
-                "/etc/X11/sessions/",
William Jon McCann 32ed7aa
-                DMCONFDIR "/Sessions/",
William Jon McCann 32ed7aa
-                DATADIR "/gdm/BuiltInSessions/",
William Jon McCann 32ed7aa
-                DATADIR "/xsessions/",
William Jon McCann 32ed7aa
-                NULL
William Jon McCann 32ed7aa
-        };
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-        exec = NULL;
William Jon McCann 32ed7aa
-        ret = FALSE;
William Jon McCann 32ed7aa
-        if (command != NULL) {
William Jon McCann 32ed7aa
-                *command = NULL;
William Jon McCann 32ed7aa
-        }
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-        key_file = g_key_file_new ();
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-        g_debug ("GdmSessionDirect: looking for session file '%s'", file);
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-        error = NULL;
William Jon McCann 32ed7aa
-        full_path = NULL;
William Jon McCann 32ed7aa
-        res = g_key_file_load_from_dirs (key_file,
William Jon McCann 32ed7aa
-                                         file,
William Jon McCann 32ed7aa
-                                         search_dirs,
William Jon McCann 32ed7aa
-                                         &full_path,
William Jon McCann 32ed7aa
-                                         G_KEY_FILE_NONE,
William Jon McCann 32ed7aa
-                                         &error);
William Jon McCann 32ed7aa
-        if (! res) {
William Jon McCann 32ed7aa
-                g_debug ("GdmSessionDirect: File '%s' not found: %s", file, error->message);
William Jon McCann 32ed7aa
-                g_error_free (error);
William Jon McCann 32ed7aa
-                if (command != NULL) {
William Jon McCann 32ed7aa
-                        *command = NULL;
William Jon McCann 32ed7aa
-                }
William Jon McCann 32ed7aa
-                goto out;
William Jon McCann 32ed7aa
-        }
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-        error = NULL;
William Jon McCann 32ed7aa
-        res = g_key_file_get_boolean (key_file,
William Jon McCann 32ed7aa
-                                      G_KEY_FILE_DESKTOP_GROUP,
William Jon McCann 32ed7aa
-                                      G_KEY_FILE_DESKTOP_KEY_HIDDEN,
William Jon McCann 32ed7aa
-                                      &error);
William Jon McCann 32ed7aa
-        if (error == NULL && res) {
William Jon McCann 32ed7aa
-                g_debug ("GdmSessionDirect: Session %s is marked as hidden", file);
William Jon McCann 32ed7aa
-                goto out;
William Jon McCann 32ed7aa
-        }
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-        error = NULL;
William Jon McCann 32ed7aa
-        exec = g_key_file_get_string (key_file,
William Jon McCann 32ed7aa
-                                      G_KEY_FILE_DESKTOP_GROUP,
William Jon McCann 32ed7aa
-                                      G_KEY_FILE_DESKTOP_KEY_TRY_EXEC,
William Jon McCann 32ed7aa
-                                      &error);
William Jon McCann 32ed7aa
-        if (exec == NULL) {
William Jon McCann 32ed7aa
-                g_debug ("GdmSessionDirect: %s key not found", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
William Jon McCann 32ed7aa
-                goto out;
William Jon McCann 32ed7aa
-        }
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-        res = is_prog_in_path (exec);
William Jon McCann 32ed7aa
-        g_free (exec);
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-        if (! res) {
William Jon McCann 32ed7aa
-                g_debug ("GdmSessionDirect: Command not found: %s", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
William Jon McCann 32ed7aa
-                goto out;
William Jon McCann 32ed7aa
-        }
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-        error = NULL;
William Jon McCann 32ed7aa
-        exec = g_key_file_get_string (key_file,
William Jon McCann 32ed7aa
-                                      G_KEY_FILE_DESKTOP_GROUP,
William Jon McCann 32ed7aa
-                                      G_KEY_FILE_DESKTOP_KEY_EXEC,
William Jon McCann 32ed7aa
-                                      &error);
William Jon McCann 32ed7aa
-        if (error != NULL) {
William Jon McCann 32ed7aa
-                g_debug ("GdmSessionDirect: %s key not found: %s",
William Jon McCann 32ed7aa
-                         G_KEY_FILE_DESKTOP_KEY_EXEC,
William Jon McCann 32ed7aa
-                         error->message);
William Jon McCann 32ed7aa
-                g_error_free (error);
William Jon McCann 32ed7aa
-                goto out;
William Jon McCann 32ed7aa
-        }
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-        if (command != NULL) {
William Jon McCann 32ed7aa
-                *command = g_strdup (exec);
William Jon McCann 32ed7aa
-        }
William Jon McCann 32ed7aa
-        ret = TRUE;
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-out:
William Jon McCann 32ed7aa
-        g_free (exec);
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
-        return ret;
William Jon McCann 32ed7aa
-}
William Jon McCann 32ed7aa
-
William Jon McCann 32ed7aa
 static const char *
William Jon McCann 32ed7aa
 get_language_name (GdmSessionDirect *session)
William Jon McCann 32ed7aa
 {
William Jon McCann 32ed7aa
@@ -1725,6 +1748,8 @@ get_language_name (GdmSessionDirect *ses
William Jon McCann 32ed7aa
 static const char *
William Jon McCann 32ed7aa
 get_session_name (GdmSessionDirect *session)
William Jon McCann 32ed7aa
 {
William Jon McCann 32ed7aa
+        /* FIXME: test the session names before we use them? */
William Jon McCann 32ed7aa
+
William Jon McCann 32ed7aa
         if (session->priv->selected_session != NULL) {
William Jon McCann 32ed7aa
                 return session->priv->selected_session;
William Jon McCann 32ed7aa
         }