diff --git a/.cvsignore b/.cvsignore
index 49626fe..f138337 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -1 +1 @@
-gdm-2.21.7.tar.gz
+gdm-2.21.8.tar.gz
diff --git a/gdm-2.21.8-fedora-logo.patch b/gdm-2.21.8-fedora-logo.patch
new file mode 100644
index 0000000..ad3f681
--- /dev/null
+++ b/gdm-2.21.8-fedora-logo.patch
@@ -0,0 +1,13 @@
+Index: gdm/gui/simple-greeter/gdm-simple-greeter.schemas.in
+===================================================================
+--- gdm/gui/simple-greeter/gdm-simple-greeter.schemas.in (revision 5874)
++++ gdm/gui/simple-greeter/gdm-simple-greeter.schemas.in (working copy)
+@@ -6,7 +6,7 @@
+ /apps/gdm/simple-greeter/logo-icon-name
+ gdm-simple-greeter
+ string
+- computer
++ fedora-logo-icon
+
+ Icon name to use for greeter logo
+ Set to the themed icon name to use for the greeter logo.
diff --git a/gdm-2.21.8-validate-dmrc.patch b/gdm-2.21.8-validate-dmrc.patch
new file mode 100644
index 0000000..426e310
--- /dev/null
+++ b/gdm-2.21.8-validate-dmrc.patch
@@ -0,0 +1,284 @@
+Index: gdm/daemon/gdm-session-direct.c
+===================================================================
+--- gdm/daemon/gdm-session-direct.c (revision 5874)
++++ gdm/daemon/gdm-session-direct.c (working copy)
+@@ -842,6 +842,130 @@ gdm_session_direct_handle_saved_language
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
+
++static gboolean
++is_prog_in_path (const char *prog)
++{
++ char *f;
++ gboolean ret;
++
++ f = g_find_program_in_path (prog);
++ ret = (f != NULL);
++ g_free (f);
++ return ret;
++}
++
++static gboolean
++get_session_command_for_file (const char *file,
++ char **command)
++{
++ GKeyFile *key_file;
++ GError *error;
++ char *full_path;
++ char *exec;
++ gboolean ret;
++ gboolean res;
++ const char *search_dirs[] = {
++ "/etc/X11/sessions/",
++ DMCONFDIR "/Sessions/",
++ DATADIR "/gdm/BuiltInSessions/",
++ DATADIR "/xsessions/",
++ NULL
++ };
++
++ exec = NULL;
++ ret = FALSE;
++ if (command != NULL) {
++ *command = NULL;
++ }
++
++ key_file = g_key_file_new ();
++
++ g_debug ("GdmSessionDirect: looking for session file '%s'", file);
++
++ error = NULL;
++ full_path = NULL;
++ res = g_key_file_load_from_dirs (key_file,
++ file,
++ search_dirs,
++ &full_path,
++ G_KEY_FILE_NONE,
++ &error);
++ if (! res) {
++ g_debug ("GdmSessionDirect: File '%s' not found: %s", file, error->message);
++ g_error_free (error);
++ if (command != NULL) {
++ *command = NULL;
++ }
++ goto out;
++ }
++
++ error = NULL;
++ res = g_key_file_get_boolean (key_file,
++ G_KEY_FILE_DESKTOP_GROUP,
++ G_KEY_FILE_DESKTOP_KEY_HIDDEN,
++ &error);
++ if (error == NULL && res) {
++ g_debug ("GdmSessionDirect: Session %s is marked as hidden", file);
++ goto out;
++ }
++
++ error = NULL;
++ exec = g_key_file_get_string (key_file,
++ G_KEY_FILE_DESKTOP_GROUP,
++ G_KEY_FILE_DESKTOP_KEY_TRY_EXEC,
++ &error);
++ if (exec == NULL) {
++ g_debug ("GdmSessionDirect: %s key not found", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
++ goto out;
++ }
++
++ res = is_prog_in_path (exec);
++ g_free (exec);
++
++ if (! res) {
++ g_debug ("GdmSessionDirect: Command not found: %s", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
++ goto out;
++ }
++
++ error = NULL;
++ exec = g_key_file_get_string (key_file,
++ G_KEY_FILE_DESKTOP_GROUP,
++ G_KEY_FILE_DESKTOP_KEY_EXEC,
++ &error);
++ if (error != NULL) {
++ g_debug ("GdmSessionDirect: %s key not found: %s",
++ G_KEY_FILE_DESKTOP_KEY_EXEC,
++ error->message);
++ g_error_free (error);
++ goto out;
++ }
++
++ if (command != NULL) {
++ *command = g_strdup (exec);
++ }
++ ret = TRUE;
++
++out:
++ g_free (exec);
++
++ return ret;
++}
++
++static gboolean
++get_session_command_for_name (const char *name,
++ char **command)
++{
++ gboolean res;
++ char *filename;
++
++ filename = g_strdup_printf ("%s.desktop", name);
++
++ command = NULL;
++ res = get_session_command_for_file (filename, command);
++
++ return res;
++}
++
+ static DBusHandlerResult
+ gdm_session_direct_handle_saved_session_name_read (GdmSessionDirect *session,
+ DBusConnection *connection,
+@@ -862,6 +986,14 @@ gdm_session_direct_handle_saved_session_
+ dbus_connection_send (connection, reply, NULL);
+ dbus_message_unref (reply);
+
++ if (! get_session_command_for_name (session_name, NULL)) {
++ /* ignore sessions that don't exist */
++ g_debug ("GdmSessionDirect: not using invalid .dmrc session: %s", session_name);
++ g_free (session->priv->saved_session);
++ session->priv->saved_session = NULL;
++ goto out;
++ }
++
+ if (strcmp (session_name,
+ get_default_session_name (session)) != 0) {
+ g_free (session->priv->saved_session);
+@@ -870,7 +1002,7 @@ gdm_session_direct_handle_saved_session_
+ _gdm_session_default_session_name_changed (GDM_SESSION (session),
+ session_name);
+ }
+-
++ out:
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
+
+@@ -1603,115 +1735,6 @@ send_environment (GdmSessionDirect *sess
+ session);
+ }
+
+-static gboolean
+-is_prog_in_path (const char *prog)
+-{
+- char *f;
+- gboolean ret;
+-
+- f = g_find_program_in_path (prog);
+- ret = (f != NULL);
+- g_free (f);
+- return ret;
+-}
+-
+-static gboolean
+-get_session_command_for_file (const char *file,
+- char **command)
+-{
+- GKeyFile *key_file;
+- GError *error;
+- char *full_path;
+- char *exec;
+- gboolean ret;
+- gboolean res;
+- const char *search_dirs[] = {
+- "/etc/X11/sessions/",
+- DMCONFDIR "/Sessions/",
+- DATADIR "/gdm/BuiltInSessions/",
+- DATADIR "/xsessions/",
+- NULL
+- };
+-
+- exec = NULL;
+- ret = FALSE;
+- if (command != NULL) {
+- *command = NULL;
+- }
+-
+- key_file = g_key_file_new ();
+-
+- g_debug ("GdmSessionDirect: looking for session file '%s'", file);
+-
+- error = NULL;
+- full_path = NULL;
+- res = g_key_file_load_from_dirs (key_file,
+- file,
+- search_dirs,
+- &full_path,
+- G_KEY_FILE_NONE,
+- &error);
+- if (! res) {
+- g_debug ("GdmSessionDirect: File '%s' not found: %s", file, error->message);
+- g_error_free (error);
+- if (command != NULL) {
+- *command = NULL;
+- }
+- goto out;
+- }
+-
+- error = NULL;
+- res = g_key_file_get_boolean (key_file,
+- G_KEY_FILE_DESKTOP_GROUP,
+- G_KEY_FILE_DESKTOP_KEY_HIDDEN,
+- &error);
+- if (error == NULL && res) {
+- g_debug ("GdmSessionDirect: Session %s is marked as hidden", file);
+- goto out;
+- }
+-
+- error = NULL;
+- exec = g_key_file_get_string (key_file,
+- G_KEY_FILE_DESKTOP_GROUP,
+- G_KEY_FILE_DESKTOP_KEY_TRY_EXEC,
+- &error);
+- if (exec == NULL) {
+- g_debug ("GdmSessionDirect: %s key not found", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
+- goto out;
+- }
+-
+- res = is_prog_in_path (exec);
+- g_free (exec);
+-
+- if (! res) {
+- g_debug ("GdmSessionDirect: Command not found: %s", G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
+- goto out;
+- }
+-
+- error = NULL;
+- exec = g_key_file_get_string (key_file,
+- G_KEY_FILE_DESKTOP_GROUP,
+- G_KEY_FILE_DESKTOP_KEY_EXEC,
+- &error);
+- if (error != NULL) {
+- g_debug ("GdmSessionDirect: %s key not found: %s",
+- G_KEY_FILE_DESKTOP_KEY_EXEC,
+- error->message);
+- g_error_free (error);
+- goto out;
+- }
+-
+- if (command != NULL) {
+- *command = g_strdup (exec);
+- }
+- ret = TRUE;
+-
+-out:
+- g_free (exec);
+-
+- return ret;
+-}
+-
+ static const char *
+ get_language_name (GdmSessionDirect *session)
+ {
+@@ -1725,6 +1748,8 @@ get_language_name (GdmSessionDirect *ses
+ static const char *
+ get_session_name (GdmSessionDirect *session)
+ {
++ /* FIXME: test the session names before we use them? */
++
+ if (session->priv->selected_session != NULL) {
+ return session->priv->selected_session;
+ }
diff --git a/gdm.spec b/gdm.spec
index e5d98c7..5db6555 100644
--- a/gdm.spec
+++ b/gdm.spec
@@ -18,7 +18,7 @@
Summary: The GNOME Display Manager
Name: gdm
-Version: 2.21.7
+Version: 2.21.8
Release: 1%{?dist}
Epoch: 1
License: GPLv2+
@@ -29,6 +29,9 @@ Source1: gdm-pam
Source2: gdm-autologin-pam
Source3: gdmsetup-pam
+Patch1: gdm-2.21.8-fedora-logo.patch
+Patch2: gdm-2.21.8-validate-dmrc.patch
+
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Prereq: /usr/sbin/useradd
@@ -98,12 +101,17 @@ several different X sessions on your local machine at the same time.
%prep
%setup -q
+%patch1 -p1 -b .fedora-logo
+%patch2 -p1 -b .validate-dmrc
%build
cp -f %{SOURCE1} data/gdm
cp -f %{SOURCE2} data/gdm-autologin
cp -f %{SOURCE3} utils/gdmsetup-pam
+intltoolize --force
+autoreconf
+
%configure --with-pam-prefix=%{_sysconfdir} \
--enable-console-helper \
--disable-scrollkeeper \
@@ -291,6 +299,9 @@ fi
%attr(1770, root, gdm) %dir %{_localstatedir}/lib/gdm
%changelog
+* Mon Feb 25 2008 Jon McCann - 1:2.21.8-1
+- Update to 2.21.8
+
* Tue Feb 12 2008 Jon McCann - 1:2.21.7-1
- Update to 2.21.7
diff --git a/sources b/sources
index 9ad61e2..84b6ba0 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-248c1ce8c8c5fb5065e5b11fc13f5000 gdm-2.21.7.tar.gz
+5eecea9d8466bcab8790699685f28b0b gdm-2.21.8.tar.gz