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