Sophie

Sophie

distrib > Mandriva > 2010.1 > x86_64 > by-pkgid > c902a7a4b130e09ad7018c0ff180989e > files > 24

gdm-2.30.2-12mdv2010.1.src.rpm

From 71334c46596f569b8413496b190fb64e417c7898 Mon Sep 17 00:00:00 2001
From: William Jon McCann <jmccann@redhat.com>
Date: Thu, 10 Jun 2010 18:38:30 -0400
Subject: [PATCH 01/14] Don't wait a mandatory 2 seconds when resetting greeter

---
 daemon/gdm-simple-slave.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index 2910366..3a47183 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -205,7 +205,7 @@ queue_greeter_reset (GdmSimpleSlave *slave)
                 return;
         }
 
-        slave->priv->greeter_reset_id = g_timeout_add_seconds (2, (GSourceFunc)greeter_reset_timeout, slave);
+        slave->priv->greeter_reset_id = g_idle_add ((GSourceFunc)greeter_reset_timeout, slave);
 }
 
 static void
-- 
1.7.1


From d5b0941a5883f65d3feba490facc503a8975ec0e Mon Sep 17 00:00:00 2001
From: William Jon McCann <jmccann@redhat.com>
Date: Fri, 11 Jun 2010 01:38:02 -0400
Subject: [PATCH 02/14] Don't crash on markup parse failure

https://bugzilla.gnome.org/show_bug.cgi?id=619588
---
 gui/simple-greeter/gdm-chooser-widget.c |   22 ++++++++++++++++------
 1 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/gui/simple-greeter/gdm-chooser-widget.c b/gui/simple-greeter/gdm-chooser-widget.c
index 0f6859a..e8f83aa 100644
--- a/gui/simple-greeter/gdm-chooser-widget.c
+++ b/gui/simple-greeter/gdm-chooser-widget.c
@@ -1367,8 +1367,6 @@ compare_item  (GtkTreeModel *model,
         GdmChooserWidget *widget;
         char             *name_a;
         char             *name_b;
-        char             *text_a;
-        char             *text_b;
         gulong            prio_a;
         gulong            prio_b;
         gboolean          is_separate_a;
@@ -1437,12 +1435,24 @@ compare_item  (GtkTreeModel *model,
                 result *= direction;
         } else if (is_separate_b == is_separate_a) {
                 if (prio_a == prio_b) {
+                        char *text_a;
+                        char *text_b;
+
+                        text_a = NULL;
+                        text_b = NULL;
                         pango_parse_markup (name_a, -1, 0, &attrs, &text_a, NULL, NULL);
+                        if (text_a == NULL) {
+                                g_debug ("GdmChooserWidget: unable to parse markup: '%s'", name_a);
+                        }
                         pango_parse_markup (name_b, -1, 0, &attrs, &text_b, NULL, NULL);
-                        if (text_a && text_b)
-                            result = g_utf8_collate (text_a, text_b);
-                        else
-                            result = g_utf8_collate (name_a, name_b);
+                        if (text_b == NULL) {
+                                g_debug ("GdmChooserWidget: unable to parse markup: '%s'", name_b);
+                        }
+                        if (text_a != NULL && text_b != NULL) {
+                                result = g_utf8_collate (text_a, text_b);
+                        } else {
+                                result = g_utf8_collate (name_a, name_b);
+                        }
                         g_free (text_a);
                         g_free (text_b);
                 } else if (prio_a > prio_b) {
-- 
1.7.1


From 125c2e9d2c80fedb9e0f51a86d0385c6fbd0e213 Mon Sep 17 00:00:00 2001
From: William Jon McCann <jmccann@redhat.com>
Date: Fri, 11 Jun 2010 01:46:39 -0400
Subject: [PATCH 03/14] Escape names before showing in markup

https://bugzilla.gnome.org/show_bug.cgi?id=619588
---
 gui/simple-greeter/gdm-chooser-widget.c |   14 +++++++++++---
 1 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/gui/simple-greeter/gdm-chooser-widget.c b/gui/simple-greeter/gdm-chooser-widget.c
index e8f83aa..4b802c7 100644
--- a/gui/simple-greeter/gdm-chooser-widget.c
+++ b/gui/simple-greeter/gdm-chooser-widget.c
@@ -1480,6 +1480,7 @@ name_cell_data_func (GtkTreeViewColumn  *tree_column,
 {
         gboolean is_in_use;
         char    *name;
+        char    *escaped;
         char    *markup;
 
         name = NULL;
@@ -1488,15 +1489,22 @@ name_cell_data_func (GtkTreeViewColumn  *tree_column,
                             CHOOSER_ITEM_IS_IN_USE_COLUMN, &is_in_use,
                             CHOOSER_NAME_COLUMN, &name,
                             -1);
+        if (name != NULL) {
+                escaped = g_markup_escape_text (name, -1);
+                g_free (name);
+        } else {
+                escaped = NULL;
+        }
 
         if (is_in_use) {
                 markup = g_strdup_printf ("<b>%s</b>\n"
                                           "<i><span size=\"x-small\">%s</span></i>",
-                                          name ? name : "(null)", widget->priv->in_use_message);
+                                          escaped != NULL ? escaped : "(none)",
+                                          widget->priv->in_use_message);
         } else {
-                markup = g_strdup_printf ("%s", name ? name : "(null)");
+                markup = g_strdup_printf ("%s", escaped != NULL ? escaped : "(none)");
         }
-        g_free (name);
+        g_free (escaped);
 
         g_object_set (cell, "markup", markup, NULL);
         g_free (markup);
-- 
1.7.1


From f49fa807884cf700b4b719685a2b2f003f6b95c4 Mon Sep 17 00:00:00 2001
From: William Jon McCann <jmccann@redhat.com>
Date: Tue, 15 Jun 2010 17:14:45 -0400
Subject: [PATCH 04/14] Fix panel shrinking after icon theme changes

https://bugzilla.gnome.org/show_bug.cgi?id=617665
---
 gui/simple-greeter/gdm-greeter-panel.c |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/gui/simple-greeter/gdm-greeter-panel.c b/gui/simple-greeter/gdm-greeter-panel.c
index caade7a..6930a80 100644
--- a/gui/simple-greeter/gdm-greeter-panel.c
+++ b/gui/simple-greeter/gdm-greeter-panel.c
@@ -253,6 +253,8 @@ gdm_greeter_panel_real_realize (GtkWidget *widget)
                 GTK_WIDGET_CLASS (gdm_greeter_panel_parent_class)->realize (widget);
         }
 
+        gdk_window_set_geometry_hints (widget->window, NULL, GDK_HINT_POS);
+
         gdm_greeter_panel_move_resize_window (GDM_GREETER_PANEL (widget), TRUE, TRUE);
 
         g_signal_connect (gtk_window_get_screen (GTK_WINDOW (widget)),
@@ -385,10 +387,6 @@ gdm_greeter_panel_real_size_request (GtkWidget      *widget,
         panel = GDM_GREETER_PANEL (widget);
         bin = GTK_BIN (widget);
 
-        if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) {
-                gtk_widget_size_request (bin->child, requisition);
-        }
-
         old_geometry = panel->priv->geometry;
 
         update_geometry (panel, requisition);
@@ -396,6 +394,10 @@ gdm_greeter_panel_real_size_request (GtkWidget      *widget,
         requisition->width  = panel->priv->geometry.width;
         requisition->height = panel->priv->geometry.height;
 
+        if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) {
+                gtk_widget_size_request (bin->child, requisition);
+        }
+
         if (! GTK_WIDGET_REALIZED (widget)) {
                 return;
         }
@@ -412,6 +414,7 @@ gdm_greeter_panel_real_size_request (GtkWidget      *widget,
 
         gdm_greeter_panel_move_resize_window (panel, position_changed, size_changed);
 }
+
 static void
 gdm_greeter_panel_real_show (GtkWidget *widget)
 {
-- 
1.7.1


From 9f6d88839c56299af2ff6c27538de87e195c8747 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 16 Jun 2010 12:33:20 -0400
Subject: [PATCH 05/14] Call XdmcpFill with properly initialized length

commit e533f4b72568cdc3d7f7ec6cec09d9392b11d54c cleaned
up various XDMCP issues, but it unfortunately also created
a bug making XDMCP fail a high percentage of the time.

XdmcpFill takes an in-out length argument.  This argument was getting
passed an uninitialized variable.
(cherry picked from commit 86ac166294f0fc8f662031167066acf1928cf139)
---
 daemon/gdm-xdmcp-display-factory.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c
index 447833d..791bba3 100644
--- a/daemon/gdm-xdmcp-display-factory.c
+++ b/daemon/gdm-xdmcp-display-factory.c
@@ -2879,12 +2879,13 @@ decode_packet (GIOChannel             *source,
                 return TRUE;
         }
 
+        ss_len = (int)gdm_sockaddr_len (&clnt_ss);
+
         res = XdmcpFill (factory->priv->socket_fd, &factory->priv->buf, (XdmcpNetaddr)&clnt_ss, &ss_len);
         if G_UNLIKELY (! res) {
                 g_debug ("GdmXdmcpDisplayFactory: Could not create XDMCP buffer!");
                 return TRUE;
         }
-        ss_len = (int)gdm_sockaddr_len (&clnt_ss);
 
         res = XdmcpReadHeader (&factory->priv->buf, &header);
         if G_UNLIKELY (! res) {
-- 
1.7.1


From 60b9b880ef397673c5e7f6a96b3f3b9ea63a40d7 Mon Sep 17 00:00:00 2001
From: Julien Cristau <jcristau@debian.org>
Date: Mon, 26 Apr 2010 19:42:16 +0200
Subject: [PATCH 06/14] xdmcp: disable IPV6_V6ONLY for ipv6 listening sockets

This allows ipv4 connections mapped to ipv6, in case the system default
is backwards.

https://bugzilla.gnome.org/show_bug.cgi?id=544730
---
 daemon/gdm-xdmcp-display-factory.c           |    8 ++++++++
 gui/simple-chooser/gdm-host-chooser-widget.c |    7 +++++++
 2 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c
index 791bba3..116cc97 100644
--- a/daemon/gdm-xdmcp-display-factory.c
+++ b/daemon/gdm-xdmcp-display-factory.c
@@ -411,6 +411,14 @@ create_socket (struct addrinfo *ai)
                 return sock;
         }
 
+#if defined(ENABLE_IPV6) && defined(IPV6_V6ONLY)
+	if (ai->ai_family == AF_INET6) {
+		int zero = 0;
+		if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero)) < 0)
+			g_warning("setsockopt(IPV6_V6ONLY): %s", g_strerror(errno));
+	}
+#endif
+
         if (bind (sock, ai->ai_addr, ai->ai_addrlen) < 0) {
                 g_warning ("bind: %s", g_strerror (errno));
                 close (sock);
diff --git a/gui/simple-chooser/gdm-host-chooser-widget.c b/gui/simple-chooser/gdm-host-chooser-widget.c
index e694728..0c8f46c 100644
--- a/gui/simple-chooser/gdm-host-chooser-widget.c
+++ b/gui/simple-chooser/gdm-host-chooser-widget.c
@@ -544,6 +544,13 @@ xdmcp_init (GdmHostChooserWidget *widget)
         widget->priv->socket_fd = socket (AF_INET6, SOCK_DGRAM, 0);
         if (widget->priv->socket_fd != -1) {
                 widget->priv->have_ipv6 = TRUE;
+#ifdef IPV6_V6ONLY
+		{
+			int zero = 0;
+			if (setsockopt(widget->priv->socket_fd, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero)) < 0)
+				g_warning("setsockopt(IPV6_V6ONLY): %s", g_strerror(errno));
+		}
+#endif
         }
 #endif
         if (! widget->priv->have_ipv6) {
-- 
1.7.1


From 45f7cba7a4e1cb12566bffd4c01e72303832a704 Mon Sep 17 00:00:00 2001
From: William Jon McCann <jmccann@redhat.com>
Date: Wed, 16 Jun 2010 18:41:49 -0400
Subject: [PATCH 07/14] Add an X11 error trap mechanism

Copied from GDK
---
 daemon/Makefile.am                |    8 ++
 daemon/factory-slave-main.c       |    2 +
 daemon/gdm-slave.c                |    1 +
 daemon/gdm-xerrors.c              |  242 +++++++++++++++++++++++++++++++++++++
 daemon/gdm-xerrors.h              |   39 ++++++
 daemon/product-slave-main.c       |    2 +
 daemon/simple-slave-main.c        |    2 +
 daemon/xdmcp-chooser-slave-main.c |    2 +
 8 files changed, 298 insertions(+), 0 deletions(-)
 create mode 100644 daemon/gdm-xerrors.c
 create mode 100644 daemon/gdm-xerrors.h

diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index ee69010..1f253ab 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -129,6 +129,8 @@ gdm_simple_slave_SOURCES = 		\
 	gdm-session-record.h		\
 	gdm-session-worker-job.c	\
 	gdm-session-worker-job.h	\
+	gdm-xerrors.h			\
+	gdm-xerrors.c			\
 	gdm-slave.c			\
 	gdm-slave.h			\
 	gdm-simple-slave.c		\
@@ -164,6 +166,8 @@ gdm_factory_slave_SOURCES = 		\
 	gdm-session-private.h		\
 	gdm-session-relay.c		\
 	gdm-session-relay.h		\
+	gdm-xerrors.h			\
+	gdm-xerrors.c			\
 	gdm-slave.c			\
 	gdm-slave.h			\
 	gdm-factory-slave.c		\
@@ -193,6 +197,8 @@ gdm_product_slave_SOURCES = 		\
 	gdm-session-record.h		\
 	gdm-session-worker-job.c	\
 	gdm-session-worker-job.h	\
+	gdm-xerrors.h			\
+	gdm-xerrors.c			\
 	gdm-slave.c			\
 	gdm-slave.h			\
 	gdm-product-slave.c		\
@@ -221,6 +227,8 @@ gdm_xdmcp_chooser_slave_SOURCES = 		\
 	gdm-welcome-session.h			\
 	gdm-chooser-session.c			\
 	gdm-chooser-session.h			\
+	gdm-xerrors.h				\
+	gdm-xerrors.c				\
 	gdm-slave.c				\
 	gdm-slave.h				\
 	gdm-xdmcp-chooser-slave.c		\
diff --git a/daemon/factory-slave-main.c b/daemon/factory-slave-main.c
index 8a99749..832dc4f 100644
--- a/daemon/factory-slave-main.c
+++ b/daemon/factory-slave-main.c
@@ -39,6 +39,7 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 
+#include "gdm-xerrors.h"
 #include "gdm-signal-handler.h"
 #include "gdm-log.h"
 #include "gdm-common.h"
@@ -197,6 +198,7 @@ main (int    argc,
                 goto out;
         }
 
+        gdm_xerrors_init ();
         gdm_log_init ();
 
         settings = gdm_settings_new ();
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index 73784dc..48e0fe8 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -46,6 +46,7 @@
 #include <X11/Xatom.h>
 
 #include "gdm-common.h"
+#include "gdm-xerrors.h"
 
 #include "gdm-slave.h"
 #include "gdm-slave-glue.h"
diff --git a/daemon/gdm-xerrors.c b/daemon/gdm-xerrors.c
new file mode 100644
index 0000000..90e6ad6
--- /dev/null
+++ b/daemon/gdm-xerrors.c
@@ -0,0 +1,242 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2010 William Jon McCann <jmccann@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+/* Most of this is derived from GTK+ (copyright GTK+ team) */
+
+#include <glib.h>
+#include <glib/gstdio.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include "gdm-xerrors.h"
+
+typedef struct _GdmErrorTrap  GdmErrorTrap;
+
+struct _GdmErrorTrap
+{
+        int (*old_handler) (Display *, XErrorEvent *);
+        int error_warnings;
+        int error_code;
+};
+
+static int          gdm_x_error                  (Display     *display,
+                                                  XErrorEvent *error);
+static int          gdm_x_io_error               (Display     *display);
+
+/* Private variable declarations
+ */
+static GSList *gdm_error_traps = NULL;               /* List of error traps */
+static GSList *gdm_error_trap_free_list = NULL;      /* Free list */
+
+static int                _gdm_error_warnings = TRUE;
+static int                _gdm_error_code = 0;
+
+void
+gdm_xerrors_init (void)
+{
+        static gboolean initialized = FALSE;
+
+        if (initialized) {
+                return;
+        }
+
+        XSetErrorHandler (gdm_x_error);
+        XSetIOErrorHandler (gdm_x_io_error);
+        initialized = TRUE;
+}
+
+/*
+ *--------------------------------------------------------------
+ * gdm_x_error
+ *
+ *   The X error handling routine.
+ *
+ * Arguments:
+ *   "display" is the X display the error orignated from.
+ *   "error" is the XErrorEvent that we are handling.
+ *
+ * Results:
+ *   Either we were expecting some sort of error to occur,
+ *   in which case we set the "_gdm_error_code" flag, or this
+ *   error was unexpected, in which case we will print an
+ *   error message and exit. (Since trying to continue will
+ *   most likely simply lead to more errors).
+ *
+ * Side effects:
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+gdm_x_error (Display     *display,
+             XErrorEvent *error)
+{
+        if (error->error_code) {
+                if (_gdm_error_warnings) {
+                        gchar buf[64];
+                        gchar *msg;
+
+                        XGetErrorText (display, error->error_code, buf, 63);
+
+                        msg =
+                                g_strdup_printf ("The program '%s' received an X Window System error.\n"
+                                                 "This probably reflects a bug in the program.\n"
+                                                 "The error was '%s'.\n"
+                                                 "  (Details: serial %ld error_code %d request_code %d minor_code %d)\n"
+                                                 "  (Note to programmers: normally, X errors are reported asynchronously;\n"
+                                                 "   that is, you will receive the error a while after causing it.\n"
+                                                 "   To debug your program, run it with the --sync command line\n"
+                                                 "   option to change this behavior. You can then get a meaningful\n"
+                                                 "   backtrace from your debugger if you break on the gdm_x_error() function.)",
+                                                 g_get_prgname (),
+                                                 buf,
+                                                 error->serial,
+                                                 error->error_code,
+                                                 error->request_code,
+                                                 error->minor_code);
+
+#ifdef G_ENABLE_DEBUG
+                        g_error ("%s", msg);
+#else /* !G_ENABLE_DEBUG */
+                        g_fprintf (stderr, "%s\n", msg);
+
+                        exit (1);
+#endif /* G_ENABLE_DEBUG */
+                }
+                _gdm_error_code = error->error_code;
+        }
+
+        return 0;
+}
+
+/*
+ *--------------------------------------------------------------
+ * gdm_x_io_error
+ *
+ *   The X I/O error handling routine.
+ *
+ * Arguments:
+ *   "display" is the X display the error orignated from.
+ *
+ * Results:
+ *   An X I/O error basically means we lost our connection
+ *   to the X server. There is not much we can do to
+ *   continue, so simply print an error message and exit.
+ *
+ * Side effects:
+ *
+ *--------------------------------------------------------------
+ */
+
+static int
+gdm_x_io_error (Display *display)
+{
+        /* This is basically modelled after the code in XLib. We need
+         * an explicit error handler here, so we can disable our atexit()
+         * which would otherwise cause a nice segfault.
+         * We fprintf(stderr, instead of g_warning() because g_warning()
+         * could possibly be redirected to a dialog
+         */
+        if (errno == EPIPE) {
+                g_fprintf (stderr,
+                           "The application '%s' lost its connection to the display %s;\n"
+                           "most likely the X server was shut down or you killed/destroyed\n"
+                           "the application.\n",
+                           g_get_prgname (),
+                           display ? DisplayString (display) : "<unknown>");
+        } else {
+                g_fprintf (stderr, "%s: Fatal IO error %d (%s) on X server %s.\n",
+                           g_get_prgname (),
+                           errno, g_strerror (errno),
+                           display ? DisplayString (display) : "<unknown>");
+        }
+
+        exit(1);
+}
+
+/*************************************************************
+ * gdm_error_trap_push:
+ *     Push an error trap. X errors will be trapped until
+ *     the corresponding gdm_error_pop(), which will return
+ *     the error code, if any.
+ *   arguments:
+ *
+ *   results:
+ *************************************************************/
+
+void
+gdm_error_trap_push (void)
+{
+        GSList *node;
+        GdmErrorTrap *trap;
+
+        if (gdm_error_trap_free_list) {
+                node = gdm_error_trap_free_list;
+                gdm_error_trap_free_list = gdm_error_trap_free_list->next;
+        } else {
+                node = g_slist_alloc ();
+                node->data = g_new (GdmErrorTrap, 1);
+        }
+
+        node->next = gdm_error_traps;
+        gdm_error_traps = node;
+
+        trap = node->data;
+        trap->old_handler = XSetErrorHandler (gdm_x_error);
+        trap->error_code = _gdm_error_code;
+        trap->error_warnings = _gdm_error_warnings;
+
+        _gdm_error_code = 0;
+        _gdm_error_warnings = 0;
+}
+
+/*************************************************************
+ * gdm_error_trap_pop:
+ *     Pop an error trap added with gdm_error_push()
+ *   arguments:
+ *
+ *   results:
+ *     0, if no error occured, otherwise the error code.
+ *************************************************************/
+
+gint
+gdm_error_trap_pop (void)
+{
+        GSList *node;
+        GdmErrorTrap *trap;
+        gint result;
+
+        g_return_val_if_fail (gdm_error_traps != NULL, 0);
+
+        node = gdm_error_traps;
+        gdm_error_traps = gdm_error_traps->next;
+
+        node->next = gdm_error_trap_free_list;
+        gdm_error_trap_free_list = node;
+
+        result = _gdm_error_code;
+
+        trap = node->data;
+        _gdm_error_code = trap->error_code;
+        _gdm_error_warnings = trap->error_warnings;
+        XSetErrorHandler (trap->old_handler);
+
+        return result;
+}
diff --git a/daemon/gdm-xerrors.h b/daemon/gdm-xerrors.h
new file mode 100644
index 0000000..16efca3
--- /dev/null
+++ b/daemon/gdm-xerrors.h
@@ -0,0 +1,39 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/* Metacity X error handling */
+
+/*
+ * Copyright (C) 2001 Havoc Pennington
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+#ifndef GDM_XERRORS_H
+#define GDM_XERRORS_H
+
+#include <glib.h>
+#include <X11/Xlib.h>
+
+typedef void (* GdmXErrorHandler) (Display     *dpy,
+                                   XErrorEvent *error,
+                                   gpointer     data);
+
+void      gdm_xerrors_init    (void);
+
+void      gdm_error_trap_push (void);
+gint      gdm_error_trap_pop  (void);
+
+#endif
diff --git a/daemon/product-slave-main.c b/daemon/product-slave-main.c
index b696ad2..7353f3a 100644
--- a/daemon/product-slave-main.c
+++ b/daemon/product-slave-main.c
@@ -39,6 +39,7 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 
+#include "gdm-xerrors.h"
 #include "gdm-signal-handler.h"
 #include "gdm-log.h"
 #include "gdm-common.h"
@@ -201,6 +202,7 @@ main (int    argc,
                 goto out;
         }
 
+        gdm_xerrors_init ();
         gdm_log_init ();
 
         settings = gdm_settings_new ();
diff --git a/daemon/simple-slave-main.c b/daemon/simple-slave-main.c
index e9d65ee..eed1742 100644
--- a/daemon/simple-slave-main.c
+++ b/daemon/simple-slave-main.c
@@ -39,6 +39,7 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 
+#include "gdm-xerrors.h"
 #include "gdm-signal-handler.h"
 #include "gdm-log.h"
 #include "gdm-common.h"
@@ -204,6 +205,7 @@ main (int    argc,
                 goto out;
         }
 
+        gdm_xerrors_init ();
         gdm_log_init ();
 
         settings = gdm_settings_new ();
diff --git a/daemon/xdmcp-chooser-slave-main.c b/daemon/xdmcp-chooser-slave-main.c
index a35c978..0b68af1 100644
--- a/daemon/xdmcp-chooser-slave-main.c
+++ b/daemon/xdmcp-chooser-slave-main.c
@@ -39,6 +39,7 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 
+#include "gdm-xerrors.h"
 #include "gdm-signal-handler.h"
 #include "gdm-log.h"
 #include "gdm-common.h"
@@ -203,6 +204,7 @@ main (int    argc,
                 goto out;
         }
 
+        gdm_xerrors_init ();
         gdm_log_init ();
 
         settings = gdm_settings_new ();
-- 
1.7.1


From 35ec8c053b70155075604787f8fbb1873bbea825 Mon Sep 17 00:00:00 2001
From: William Jon McCann <jmccann@redhat.com>
Date: Wed, 16 Jun 2010 17:50:48 -0400
Subject: [PATCH 08/14] Trap errors for XAddHosts

Apparently this can fail on older systems.

https://bugzilla.gnome.org/show_bug.cgi?id=599683
---
 daemon/gdm-slave.c |   12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index 48e0fe8..4c6e33e 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -511,8 +511,14 @@ gdm_slave_connect_to_x11_display (GdmSlave *slave)
                  * display independent of current hostname
                  */
                 gdm_slave_setup_xhost_auth (host_entries, si_entries);
+
+                gdm_error_trap_push ();
                 XAddHosts (slave->priv->server_display, host_entries,
                            G_N_ELEMENTS (host_entries));
+                XSync (slave->priv->server_display, False);
+                if (gdm_error_trap_pop ()) {
+                        g_warning ("Failed to give slave programs access to the display. Trying to proceed.");
+                }
 
                 gdm_slave_set_windowpath (slave);
         } else {
@@ -853,8 +859,14 @@ gdm_slave_add_user_authorization (GdmSlave   *slave,
          * user session is starting.
          */
         gdm_slave_setup_xhost_auth (host_entries, si_entries);
+        gdm_error_trap_push ();
         XRemoveHosts (slave->priv->server_display, host_entries,
                       G_N_ELEMENTS (host_entries));
+        XSync (slave->priv->server_display, False);
+        if (gdm_error_trap_pop ()) {
+                g_warning ("Failed to remove slave program access to the display. Trying to proceed.");
+        }
+
 
         return res;
 }
-- 
1.7.1


From 135b9e9b61eb7adf3415ba02483557c4d103d294 Mon Sep 17 00:00:00 2001
From: William Jon McCann <jmccann@redhat.com>
Date: Wed, 16 Jun 2010 19:53:47 -0400
Subject: [PATCH 09/14] g_array_free doesn't allow NULLs

https://bugzilla.gnome.org/show_bug.cgi?id=589536
---
 daemon/gdm-slave.c                 |    4 +++-
 daemon/gdm-xdmcp-display-factory.c |    2 ++
 2 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index 4c6e33e..331ca01 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -1677,7 +1677,9 @@ gdm_slave_finalize (GObject *object)
         g_free (slave->priv->parent_display_name);
         g_free (slave->priv->parent_display_x11_authority_file);
         g_free (slave->priv->windowpath);
-        g_array_free (slave->priv->display_x11_cookie, TRUE);
+        if (slave->priv->display_x11_cookie != NULL) {
+                g_array_free (slave->priv->display_x11_cookie, TRUE);
+        }
 
         G_OBJECT_CLASS (gdm_slave_parent_class)->finalize (object);
 }
diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c
index 116cc97..06fafae 100644
--- a/daemon/gdm-xdmcp-display-factory.c
+++ b/daemon/gdm-xdmcp-display-factory.c
@@ -2353,8 +2353,10 @@ gdm_xdmcp_handle_request (GdmXdmcpDisplayFactory *factory,
                                 GArray *cookie;
                                 char   *name;
 
+                                cookie = NULL;
                                 gdm_display_get_x11_cookie (display, &cookie, NULL);
 
+                                name = NULL;
                                 gdm_display_get_x11_display_name (display, &name, NULL);
 
                                 g_debug ("GdmXdmcpDisplayFactory: Sending authorization key for display %s", name ? name : "(null)");
-- 
1.7.1


From efa40475380774923b6c16a750b9611df8378773 Mon Sep 17 00:00:00 2001
From: William Jon McCann <jmccann@redhat.com>
Date: Wed, 16 Jun 2010 20:06:01 -0400
Subject: [PATCH 10/14] Print the version when asked to

https://bugzilla.gnome.org/show_bug.cgi?id=594857
---
 daemon/main.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/daemon/main.c b/daemon/main.c
index cfc3655..81dd9d3 100644
--- a/daemon/main.c
+++ b/daemon/main.c
@@ -560,6 +560,11 @@ main (int    argc,
                 goto out;
         }
 
+        if (print_version) {
+                g_print ("GDM %s\n", VERSION);
+                exit (1);
+        }
+
         if (fatal_warnings) {
                 GLogLevelFlags fatal_mask;
 
-- 
1.7.1


From 92464a3b88abfc7e8bc96e9b6f6df105cf071f0d Mon Sep 17 00:00:00 2001
From: Wang Xin <jedy.wang@sun.com>
Date: Wed, 9 Jun 2010 15:10:18 -0400
Subject: [PATCH 11/14] GdmProductSlave does not handle OpenSession

In gdm-product-slave.c:relay_dbus_handle_message, there is no code
handling OpenSession request from GdmSessionRelay of GdmFactorySlave, so
factory/product mode would not work.

https://bugzilla.gnome.org/show_bug.cgi?id=618834
---
 daemon/gdm-product-slave.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c
index 1fff780..5ecc1e9 100644
--- a/daemon/gdm-product-slave.c
+++ b/daemon/gdm-product-slave.c
@@ -809,6 +809,13 @@ on_relay_start_conversation (GdmProductSlave *slave,
 }
 
 static void
+on_relay_open_session (GdmProductSlave *slave,
+                        DBusMessage     *message)
+{
+        gdm_session_open_session (GDM_SESSION (slave->priv->session));
+}
+
+static void
 on_relay_start_session (GdmProductSlave *slave,
                         DBusMessage     *message)
 {
@@ -1014,6 +1021,8 @@ relay_dbus_handle_message (DBusConnection *connection,
                 on_relay_layout_selected (slave, message);
         } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "UserSelected")) {
                 on_relay_user_selected (slave, message);
+        } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "OpenSession")) {
+                on_relay_open_session (slave, message);
         } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "StartSession")) {
                 on_relay_start_session (slave, message);
         } else if (dbus_message_is_signal (message, RELAY_SERVER_DBUS_INTERFACE, "StartConversation")) {
@@ -1250,6 +1259,8 @@ gdm_product_slave_finalize (GObject *object)
 
         gdm_product_slave_stop (GDM_SLAVE (slave));
 
+        g_free (slave->priv->relay_address);
+
         G_OBJECT_CLASS (gdm_product_slave_parent_class)->finalize (object);
 }
 
-- 
1.7.1


From b29d039949c67faf74c2c0842b46eb8e1e0c0a2b Mon Sep 17 00:00:00 2001
From: Wang Xin <jedy.wang@sun.com>
Date: Thu, 17 Jun 2010 13:39:33 -0400
Subject: [PATCH 12/14] Various memory leak fixes

https://bugzilla.gnome.org/show_bug.cgi?id=620430
With help from Pablo Castellano
---
 daemon/gdm-product-display.c    |    2 ++
 daemon/gdm-product-slave.c      |    1 +
 daemon/gdm-server.c             |   12 ++++++++++++
 daemon/gdm-session-direct.c     |    7 ++-----
 daemon/gdm-session-worker-job.c |    3 +++
 daemon/gdm-session-worker.c     |   26 +++++++++++++-------------
 daemon/gdm-simple-slave.c       |   16 ++++++++++++----
 daemon/gdm-slave-proxy.c        |    1 +
 daemon/gdm-slave.c              |    1 +
 daemon/gdm-welcome-session.c    |   12 +++++++++++-
 10 files changed, 58 insertions(+), 23 deletions(-)

diff --git a/daemon/gdm-product-display.c b/daemon/gdm-product-display.c
index 5dbc4d1..9b68cb9 100644
--- a/daemon/gdm-product-display.c
+++ b/daemon/gdm-product-display.c
@@ -244,6 +244,8 @@ gdm_product_display_finalize (GObject *object)
 
         g_return_if_fail (product_display->priv != NULL);
 
+        g_free (product_display->priv->relay_address);
+
         G_OBJECT_CLASS (gdm_product_display_parent_class)->finalize (object);
 }
 
diff --git a/daemon/gdm-product-slave.c b/daemon/gdm-product-slave.c
index 5ecc1e9..d4611a9 100644
--- a/daemon/gdm-product-slave.c
+++ b/daemon/gdm-product-slave.c
@@ -854,6 +854,7 @@ create_new_session (GdmProductSlave *slave)
         g_free (display_id);
         g_free (display_name);
         g_free (display_hostname);
+        g_free (display_x11_authority_file);
         g_free (display_device);
 
         g_signal_connect (slave->priv->session,
diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c
index 9dc01f7..63e8cb3 100644
--- a/daemon/gdm-server.c
+++ b/daemon/gdm-server.c
@@ -503,6 +503,7 @@ get_server_environment (GdmServer *server)
                 char **str;
                 str = g_strsplit (*l, "=", 2);
                 g_hash_table_insert (hash, str[0], str[1]);
+                g_free (str);
         }
 
         /* modify environment here */
@@ -953,6 +954,17 @@ gdm_server_finalize (GObject *object)
 
         gdm_server_stop (server);
 
+        g_free (server->priv->command);
+        g_free (server->priv->user_name);
+        g_free (server->priv->session_args);
+        g_free (server->priv->log_dir);
+        g_free (server->priv->display_name);
+        g_free (server->priv->display_device);
+        g_free (server->priv->auth_file);
+        g_free (server->priv->parent_display_name);
+        g_free (server->priv->parent_auth_file);
+        g_free (server->priv->chosen_hostname);
+
         G_OBJECT_CLASS (gdm_server_parent_class)->finalize (object);
 }
 
diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c
index 031ae33..9ba2e6c 100644
--- a/daemon/gdm-session-direct.c
+++ b/daemon/gdm-session-direct.c
@@ -493,7 +493,6 @@ get_session_command_for_file (const char *file,
 {
         GKeyFile   *key_file;
         GError     *error;
-        char       *full_path;
         char       *exec;
         gboolean    ret;
         gboolean    res;
@@ -509,11 +508,10 @@ get_session_command_for_file (const char *file,
         g_debug ("GdmSessionDirect: looking for session file '%s'", file);
 
         error = NULL;
-        full_path = NULL;
         res = g_key_file_load_from_dirs (key_file,
                                          file,
                                          get_system_session_dirs (),
-                                         &full_path,
+                                         NULL,
                                          G_KEY_FILE_NONE,
                                          &error);
         if (! res) {
@@ -2186,7 +2184,6 @@ gdm_session_direct_bypasses_xsession (GdmSessionDirect *session_direct)
         gboolean    res;
         gboolean    bypasses_xsession = FALSE;
         char       *filename;
-        char       *full_path;
 
         g_return_val_if_fail (session_direct != NULL, FALSE);
         g_return_val_if_fail (GDM_IS_SESSION_DIRECT (session_direct), FALSE);
@@ -2198,7 +2195,7 @@ gdm_session_direct_bypasses_xsession (GdmSessionDirect *session_direct)
         res = g_key_file_load_from_dirs (key_file,
                                          filename,
                                          get_system_session_dirs (),
-                                         &full_path,
+                                         NULL,
                                          G_KEY_FILE_NONE,
                                          &error);
         if (! res) {
diff --git a/daemon/gdm-session-worker-job.c b/daemon/gdm-session-worker-job.c
index 633d6e2..e4a5957 100644
--- a/daemon/gdm-session-worker-job.c
+++ b/daemon/gdm-session-worker-job.c
@@ -439,6 +439,9 @@ gdm_session_worker_job_finalize (GObject *object)
 
         gdm_session_worker_job_stop (session_worker_job);
 
+        g_free (session_worker_job->priv->command);
+        g_free (session_worker_job->priv->server_address);
+
         G_OBJECT_CLASS (gdm_session_worker_job_parent_class)->finalize (object);
 }
 
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index 5e34fb9..03a1d80 100644
--- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c
@@ -1652,6 +1652,9 @@ gdm_session_worker_accredit_user (GdmSessionWorker  *worker,
 
         ret = FALSE;
 
+        home = NULL;
+        shell = NULL;
+
         if (worker->priv->username == NULL) {
                 g_debug ("GdmSessionWorker: Username not set");
                 error_code = PAM_USER_UNKNOWN;
@@ -1662,8 +1665,6 @@ gdm_session_worker_accredit_user (GdmSessionWorker  *worker,
                 goto out;
         }
 
-        home = NULL;
-        shell = NULL;
         uid = 0;
         gid = 0;
         res = _lookup_passwd_info (worker->priv->username,
@@ -1722,6 +1723,8 @@ gdm_session_worker_accredit_user (GdmSessionWorker  *worker,
         ret = TRUE;
 
  out:
+        g_free (home);
+        g_free (shell);
         if (ret) {
                 g_debug ("GdmSessionWorker: state ACCREDITED");
                 ret = TRUE;
@@ -2970,19 +2973,16 @@ gdm_session_worker_finalize (GObject *object)
 
         gdm_session_worker_unwatch_child (worker);
 
-        if (worker->priv->username != NULL) {
-                g_free (worker->priv->username);
-                worker->priv->username = NULL;
-        }
-
-        if (worker->priv->arguments != NULL) {
-                g_strfreev (worker->priv->arguments);
-                worker->priv->arguments = NULL;
-        }
-
+        g_free (worker->priv->service);
+        g_free (worker->priv->x11_display_name);
+        g_free (worker->priv->x11_authority_file);
+        g_free (worker->priv->display_device);
+        g_free (worker->priv->hostname);
+        g_free (worker->priv->username);
+        g_free (worker->priv->server_address);
+        g_strfreev (worker->priv->arguments);
         if (worker->priv->environment != NULL) {
                 g_hash_table_destroy (worker->priv->environment);
-                worker->priv->environment = NULL;
         }
 
         G_OBJECT_CLASS (gdm_session_worker_parent_class)->finalize (object);
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index 3a47183..fb14223 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -110,7 +110,10 @@ on_session_started (GdmSession       *session,
 
         /* Run the PreSession script. gdmslave suspends until script has terminated */
         username = gdm_session_direct_get_username (slave->priv->session);
-        gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/PreSession", username);
+        if (username != NULL) {
+                gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/PreSession", username);
+        }
+        g_free (username);
 
         /* FIXME: should we do something here?
          * Note that error return status from PreSession script should
@@ -131,7 +134,10 @@ on_session_exited (GdmSession     *session,
 
         /* Run the PostSession script. gdmslave suspends until script has terminated */
         username = gdm_session_direct_get_username (slave->priv->session);
-        gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/PostSession", username);
+        if (username != NULL) {
+                gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/PostSession", username);
+        }
+        g_free (username);
 
         gdm_slave_stopped (GDM_SLAVE (slave));
 }
@@ -354,6 +360,7 @@ stop_greeter (GdmSimpleSlave *slave)
         if (username != NULL) {
                 gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/PostLogin", username);
         }
+        g_free (username);
 
         gdm_welcome_session_stop (GDM_WELCOME_SESSION (slave->priv->greeter));
         gdm_greeter_server_stop (slave->priv->greeter_server);
@@ -1003,8 +1010,6 @@ start_greeter (GdmSimpleSlave *slave)
 
         gdm_greeter_server_start (slave->priv->greeter_server);
 
-        address = gdm_greeter_server_get_address (slave->priv->greeter_server);
-
         g_debug ("GdmSimpleSlave: Creating greeter on %s %s %s", display_name, display_device, display_hostname);
         slave->priv->greeter = gdm_greeter_session_new (display_name,
                                                         display_device,
@@ -1029,7 +1034,10 @@ start_greeter (GdmSimpleSlave *slave)
         g_object_set (slave->priv->greeter,
                       "x11-authority-file", auth_file,
                       NULL);
+
+        address = gdm_greeter_server_get_address (slave->priv->greeter_server);
         gdm_welcome_session_set_server_address (GDM_WELCOME_SESSION (slave->priv->greeter), address);
+        g_free (address);
         gdm_welcome_session_start (GDM_WELCOME_SESSION (slave->priv->greeter));
 
         g_free (display_id);
diff --git a/daemon/gdm-slave-proxy.c b/daemon/gdm-slave-proxy.c
index d58d2c5..48efbd1 100644
--- a/daemon/gdm-slave-proxy.c
+++ b/daemon/gdm-slave-proxy.c
@@ -422,6 +422,7 @@ gdm_slave_proxy_finalize (GObject *object)
         g_return_if_fail (slave->priv != NULL);
 
         g_free (slave->priv->command);
+        g_free (slave->priv->log_path);
 
         G_OBJECT_CLASS (gdm_slave_proxy_parent_class)->finalize (object);
 }
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index 331ca01..e032241 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -331,6 +331,7 @@ gdm_slave_run_script (GdmSlave   *slave,
 
         g_ptr_array_foreach (env, (GFunc)g_free, NULL);
         g_ptr_array_free (env, TRUE);
+        g_strfreev (argv);
 
         if (! res) {
                 g_warning ("GdmSlave: Unable to run script: %s", error->message);
diff --git a/daemon/gdm-welcome-session.c b/daemon/gdm-welcome-session.c
index 0a6487a..c0842ac 100644
--- a/daemon/gdm-welcome-session.c
+++ b/daemon/gdm-welcome-session.c
@@ -767,7 +767,7 @@ parse_dbus_launch_output (const char *output,
         }
 
         if (addressp != NULL) {
-                *addressp = g_strdup (g_match_info_fetch (match_info, 1));
+                *addressp = g_match_info_fetch (match_info, 1);
         }
 
         if (pidp != NULL) {
@@ -804,6 +804,8 @@ start_dbus_daemon (GdmWelcomeSession *welcome_session)
 
         env = get_welcome_environment (welcome_session);
 
+        std_out = NULL;
+        std_err = NULL;
         error = NULL;
         res = spawn_command_line_sync_as_user (DBUS_LAUNCH_COMMAND,
                                                welcome_session->priv->user_name,
@@ -834,6 +836,8 @@ start_dbus_daemon (GdmWelcomeSession *welcome_session)
                 g_debug ("GdmWelcomeSession: Started D-Bus daemon on pid %d", welcome_session->priv->dbus_pid);
         }
  out:
+        g_free (std_out);
+        g_free (std_err);
         return res;
 }
 
@@ -1401,6 +1405,10 @@ gdm_welcome_session_finalize (GObject *object)
 
         gdm_welcome_session_stop (welcome_session);
 
+        if (welcome_session->priv->ckc != NULL) {
+                ck_connector_unref (welcome_session->priv->ckc);
+        }
+
         g_free (welcome_session->priv->command);
         g_free (welcome_session->priv->user_name);
         g_free (welcome_session->priv->group_name);
@@ -1412,6 +1420,8 @@ gdm_welcome_session_finalize (GObject *object)
         g_free (welcome_session->priv->server_address);
         g_free (welcome_session->priv->server_dbus_path);
         g_free (welcome_session->priv->server_dbus_interface);
+        g_free (welcome_session->priv->server_env_var_name);
+        g_free (welcome_session->priv->dbus_bus_address);
 
         G_OBJECT_CLASS (gdm_welcome_session_parent_class)->finalize (object);
 }
-- 
1.7.1


From 9f871810f0c15d5a74e42a92ca0e8925e4a6540b Mon Sep 17 00:00:00 2001
From: William Jon McCann <jmccann@redhat.com>
Date: Thu, 17 Jun 2010 17:10:20 -0400
Subject: [PATCH 13/14] Fix brokenness in parse enriched login
 (cherry picked from commit 3b50b45f3db6078c89819d0a82194520f2c697a1)

---
 daemon/gdm-slave.c |  140 ++++++++++++++++++++++++++++------------------------
 1 files changed, 76 insertions(+), 64 deletions(-)

diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index e032241..0702eb3 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -872,80 +872,91 @@ gdm_slave_add_user_authorization (GdmSlave   *slave,
         return res;
 }
 
-static gchar *
-gdm_slave_parse_enriched_login (GdmSlave *slave,
-                                char *username,
-                                char *display_name)
+static char *
+gdm_slave_parse_enriched_login (GdmSlave   *slave,
+                                const char *username,
+                                const char *display_name)
 {
-        char in_buffer[20];
-        char **argv = NULL;
-        gint pipe1[2], in_buffer_len;
-        int  username_length;
-        pid_t pid;
+        char     **argv;
+        int        username_len;
+        GPtrArray *env;
+        GError    *error;
+        gboolean   res;
+        char      *parsed_username;
+        char      *command;
+        char      *std_output;
+        char      *std_error;
 
-        if (username == NULL)
-                return (NULL);
+        parsed_username = NULL;
+
+        if (username == NULL || username[0] == '\0') {
+                return NULL;
+        }
 
         /* A script may be used to generate the automatic/timed login name
            based on the display/host by ending the name with the pipe symbol
            '|'. */
 
-        username_length = strlen (username);
-        if (username_length > 0 && username[username_length-1] == '|') {
-                GPtrArray *env;
-                GError    *error;
-                gboolean   res;
-                char     **argv;
-                char      *std_output;
-                char      *std_error;
-
-                /* Remove the pipe symbol */
-                username[username_length-1] = '\0';
-
-                argv = NULL;
-                error = NULL;
-                if (! g_shell_parse_argv (username, NULL, &argv, &error)) {
-                      g_warning ("Could not parse command: %s", error->message);
-                      return (NULL);
-                }
+        username_len = strlen (username);
+        if (username[username_len - 1] != '|') {
+                return g_strdup (username);
+        }
 
-                g_debug ("Calling script %s to acquire auto/timed username",
-                         username);
-
-                env = get_script_environment (slave, NULL);
-                error = NULL;
-                res = g_spawn_sync (NULL,
-                                    argv,
-                                    (char **)env->pdata,
-                                    G_SPAWN_SEARCH_PATH,
-                                    NULL,
-                                    NULL,
-                                    &std_output,
-                                    &std_error,
-                                    NULL,
-                                    &error);
-
-                g_ptr_array_foreach (env, (GFunc)g_free, NULL);
-                g_ptr_array_free (env, TRUE);
-                g_strfreev (argv);
-
-                if (! res) {
-                        g_warning ("Unable to launch auto/timed login script: %s", error->message);
-                        g_error_free (error);
-	        } else {
-                        if (std_output != NULL) {
-                                g_strchomp (std_output);
-                                if (std_output[0] != '\0') {
-                                        return (g_strdup (std_output));
-                                }
-                        }
-                        return NULL;
+        /* Remove the pipe symbol */
+        command = g_strndup (username, username_len - 1);
+
+        argv = NULL;
+        error = NULL;
+        if (! g_shell_parse_argv (command, NULL, &argv, &error)) {
+                g_warning ("GdmSlave: Could not parse command '%s': %s", command, error->message);
+                g_error_free (error);
+
+                g_free (command);
+                goto out;
+        }
+
+        g_debug ("GdmSlave: running '%s' to acquire auto/timed username", command);
+        g_free (command);
+
+        env = get_script_environment (slave, NULL);
+
+        error = NULL;
+        std_output = NULL;
+        std_error = NULL;
+        res = g_spawn_sync (NULL,
+                            argv,
+                            (char **)env->pdata,
+                            G_SPAWN_SEARCH_PATH,
+                            NULL,
+                            NULL,
+                            &std_output,
+                            &std_error,
+                            NULL,
+                            &error);
+
+        g_ptr_array_foreach (env, (GFunc)g_free, NULL);
+        g_ptr_array_free (env, TRUE);
+        g_strfreev (argv);
+
+        if (! res) {
+                g_warning ("GdmSlave: Unable to launch auto/timed login script '%s': %s", username, error->message);
+                g_error_free (error);
+
+                g_free (std_output);
+                g_free (std_error);
+                goto out;
+        }
+
+        if (std_output != NULL) {
+                g_strchomp (std_output);
+                if (std_output[0] != '\0') {
+                        parsed_username = g_strdup (std_output);
                 }
-        } else {
-                return (g_strdup (username));
         }
 
-	return NULL;
+ out:
+
+        return parsed_username;
 }
 
 gboolean
@@ -990,7 +1001,8 @@ gdm_slave_get_timed_login_details (GdmSlave   *slave,
 
         if (usernamep != NULL) {
                 *usernamep = gdm_slave_parse_enriched_login (slave,
-                        username, slave->priv->display_name);
+                                                             username,
+                                                             slave->priv->display_name);
         } else {
                 g_free (username);
 
-- 
1.7.1


From 3e6f1c4e35fb2339ac9bc74dd9143ef96fe2512a Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Thu, 17 Jun 2010 11:59:36 -0400
Subject: [PATCH 14/14] Call XdmcpFill with properly initialized length

This is just like commit 86ac166294f0fc8f662031167066acf1928cf139,
but in a different place in the code.

Spotted by mariodebian <mariodebian@gmail.com>
(cherry picked from commit f7a7158efcaa3e113a02dd0f0bfdf22a253928e5)
---
 gui/simple-chooser/gdm-host-chooser-widget.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/gui/simple-chooser/gdm-host-chooser-widget.c b/gui/simple-chooser/gdm-host-chooser-widget.c
index 0c8f46c..352c1e2 100644
--- a/gui/simple-chooser/gdm-host-chooser-widget.c
+++ b/gui/simple-chooser/gdm-host-chooser-widget.c
@@ -208,12 +208,13 @@ decode_packet (GIOChannel           *source,
                 return TRUE;
         }
 
+        ss_len = (int)gdm_sockaddr_len (&clnt_ss);
+
         res = XdmcpFill (widget->priv->socket_fd, &buf, (XdmcpNetaddr)&clnt_ss, &ss_len);
         if G_UNLIKELY (! res) {
                 g_debug (_("XDMCP: Could not create XDMCP buffer!"));
                 return TRUE;
         }
-        ss_len = (int)gdm_sockaddr_len (&clnt_ss);
 
         res = XdmcpReadHeader (&buf, &header);
         if G_UNLIKELY (! res) {
-- 
1.7.1