summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Jon McCann <jmccann@redhat.com>2010-06-17 14:44:28 -0400
committerWilliam Jon McCann <jmccann@redhat.com>2010-06-17 17:36:03 -0400
commit60a7cd93a499b704ca98fe9e5292d8897bdb8a2b (patch)
tree2baf5c53f5833bb2d0a7c8a18b5b0a9e41c105f8
parent311f2bd3c0870624449175b789d5f415e24083de (diff)
downloadgdm-60a7cd93a499b704ca98fe9e5292d8897bdb8a2b.tar.gz
Don't leak the fallback session name
(cherry picked from commit 2b241b976960e68269ef2a09414cb7ab0c915761)
-rw-r--r--daemon/gdm-session-direct.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c
index 57e5515f..d1fec908 100644
--- a/daemon/gdm-session-direct.c
+++ b/daemon/gdm-session-direct.c
@@ -94,6 +94,8 @@ struct _GdmSessionDirectPrivate
char *display_x11_authority_file;
gboolean display_is_local;
+ char *fallback_session_name;
+
DBusServer *server;
char *server_address;
GHashTable *environment;
@@ -642,8 +644,8 @@ get_default_layout_name (GdmSessionDirect *session)
return session->priv->saved_layout;
}
-static char *
-get_fallback_session_name (void)
+static const char *
+get_fallback_session_name (GdmSessionDirect *session_direct)
{
const char **search_dirs;
int i;
@@ -651,16 +653,26 @@ get_fallback_session_name (void)
GSequence *sessions;
GSequenceIter *session;
+ if (session_direct->priv->fallback_session_name != NULL) {
+ /* verify that the cached version still exists */
+ if (get_session_command_for_name (session_direct->priv->fallback_session_name, NULL)) {
+ goto out;
+ }
+ }
+
name = g_strdup ("gnome");
if (get_session_command_for_name (name, NULL)) {
- return name;
+ g_free (session_direct->priv->fallback_session_name);
+ session_direct->priv->fallback_session_name = name;
+ goto out;
}
+ g_free (name);
sessions = g_sequence_new (g_free);
search_dirs = get_system_session_dirs ();
for (i = 0; search_dirs[i] != NULL; i++) {
- GDir *dir;
+ GDir *dir;
const char *base_name;
dir = g_dir_open (search_dirs[i], 0, NULL);
@@ -689,6 +701,7 @@ get_fallback_session_name (void)
g_dir_close (dir);
}
+ name = NULL;
session = g_sequence_get_begin_iter (sessions);
do {
if (g_sequence_get (session)) {
@@ -705,9 +718,13 @@ get_fallback_session_name (void)
session = g_sequence_iter_next (session);
} while (!g_sequence_iter_is_end (session));
+ g_free (session_direct->priv->fallback_session_name);
+ session_direct->priv->fallback_session_name = name;
+
g_sequence_free (sessions);
- return name;
+ out:
+ return session_direct->priv->fallback_session_name;
}
static const char *
@@ -717,7 +734,7 @@ get_default_session_name (GdmSessionDirect *session)
return session->priv->saved_session;
}
- return get_fallback_session_name ();
+ return get_fallback_session_name (session);
}
static void
@@ -2491,6 +2508,8 @@ gdm_session_direct_finalize (GObject *object)
g_free (session->priv->selected_layout);
g_free (session->priv->saved_layout);
+ g_free (session->priv->fallback_session_name);
+
parent_class = G_OBJECT_CLASS (gdm_session_direct_parent_class);
if (parent_class->finalize != NULL)