Am 13.05.2017 um 20:40 schrieb Michael Biebl:
> The complete debdiff is attached. I only filtered autotools related
> noise.

Oops, one pipe too many. Seems I managed to attach the diffstat, not the
actual debdiff.
Please find it attached now.

Michael

-- 
Why is it that all of the instruments seeking intelligent life in the
universe are pointed away from Earth?
diff -Nru gdm3-3.22.1/common/gdm-address.c gdm3-3.22.3/common/gdm-address.c
--- gdm3-3.22.1/common/gdm-address.c    2016-09-21 21:27:19.000000000 +0200
+++ gdm3-3.22.3/common/gdm-address.c    2017-03-03 21:32:41.000000000 +0100
@@ -220,14 +220,13 @@
 
 static void
 _gdm_address_debug (GdmAddress *address,
-                    const char *hostname,
                     const char *host,
                     const char *port)
 {
-        g_debug ("Address family:%d (%s) hostname:%s host:%s port:%s local:%d 
loopback:%d",
+        g_debug ("Address family:%d (%s) host:%s port:%s local:%d loopback:%d",
+
                  address->ss->ss_family,
                  address_family_str (address) ? address_family_str (address) : 
"(null)",
-                 hostname ? hostname : "(null)",
                  host ? host : "(null)",
                  port ? port : "(null)",
                  gdm_address_is_local (address),
@@ -237,13 +236,14 @@
 void
 gdm_address_debug (GdmAddress *address)
 {
-        char *hostname;
-        char *host;
-        char *port;
+        char *hostname = NULL;
+        char *host = NULL;
+        char *port = NULL;
 
-        gdm_address_get_hostname (address, &hostname);
         gdm_address_get_numeric_info (address, &host, &port);
 
+        _gdm_address_debug (address, host, port);
+
         g_free (hostname);
         g_free (host);
         g_free (port);
@@ -277,7 +277,8 @@
                 err_msg = gai_strerror (res);
                 g_warning ("Unable to lookup hostname: %s",
                         err_msg ? err_msg : "(null)");
-                _gdm_address_debug (address, NULL, NULL, NULL);
+                _gdm_address_debug (address, NULL, NULL);
+
         }
 
         /* try numeric? */
@@ -318,7 +319,7 @@
                 err_msg = gai_strerror (res);
                 g_warning ("Unable to lookup numeric info: %s",
                         err_msg ? err_msg : "(null)");
-                _gdm_address_debug (address, NULL, NULL, NULL);
+                _gdm_address_debug (address, NULL, NULL);
         } else {
                 ret = TRUE;
         }
@@ -404,8 +405,6 @@
                                         address = 
gdm_address_new_from_sockaddr ((struct sockaddr *)&ifreq.ifr_addr,
                                                                                
  sizeof (struct sockaddr));
 
-                                        gdm_address_debug (address);
-
                                         *list = g_list_append (*list, address);
                                 }
                         }
@@ -437,7 +436,8 @@
 
         memset (&hints, 0, sizeof (hints));
         hints.ai_family = AF_UNSPEC;
-        hints.ai_flags = AI_CANONNAME;
+        hints.ai_flags = AI_CANONNAME | AI_NUMERICHOST;
+
 
         g_debug ("GdmAddress: looking up hostname: %s", hostbuf);
         result = NULL;
diff -Nru gdm3-3.22.1/configure.ac gdm3-3.22.3/configure.ac
--- gdm3-3.22.1/configure.ac    2016-10-12 19:58:41.000000000 +0200
+++ gdm3-3.22.3/configure.ac    2017-03-06 18:09:04.000000000 +0100
@@ -1,7 +1,7 @@
 
 AC_PREREQ([2.60])
 AC_INIT([gdm],
-        [3.22.1],
+        [3.22.3],
         [http://bugzilla.gnome.org/enter_bug.cgi?product=gdm])
 
 AC_CONFIG_SRCDIR([daemon/gdm-manager.c])
@@ -84,6 +84,7 @@
         gio-2.0 >= $GLIB_REQUIRED_VERSION
         gio-unix-2.0 >= $GLIB_REQUIRED_VERSION
         accountsservice >= $ACCOUNTS_SERVICE_REQUIRED_VERSION
+        xcb
 )
 AC_SUBST(DAEMON_CFLAGS)
 AC_SUBST(DAEMON_LIBS)
@@ -194,6 +195,16 @@
   AC_DEFINE(ENABLE_SPLIT_AUTHENTICATION, 1, [Define if split authentication is 
enabled])
 fi
 
+AC_ARG_ENABLE(user-display-server,
+             AS_HELP_STRING([--enable-user-display-server],
+                             [Enable running X server as user 
@<:@default=yes@:>@]),,
+              enable_user_display_server=yes)
+AM_CONDITIONAL(ENABLE_USER_DISPLAY_SERVER, test x$user_display_server = xyes)
+
+if test x$enable_user_display_server = xyes; then
+  AC_DEFINE(ENABLE_USER_DISPLAY_SERVER, 1, [Define if user display servers are 
supported])
+fi
+
 AC_ARG_WITH(default-pam-config,
            AS_HELP_STRING([--with-default-pam-config: One of redhat, 
openembedded, exherbo, lfs, arch, none @<:@default=auto@:>@]))
 dnl If not given, try autodetecting from release files (see NetworkManager 
source) 
diff -Nru gdm3-3.22.1/daemon/gdm-display.c gdm3-3.22.3/daemon/gdm-display.c
--- gdm3-3.22.1/daemon/gdm-display.c    2016-09-21 21:27:19.000000000 +0200
+++ gdm3-3.22.3/daemon/gdm-display.c    2017-03-01 21:58:01.000000000 +0100
@@ -34,8 +34,7 @@
 #include <glib/gi18n.h>
 #include <glib-object.h>
 
-#include <X11/Xlib.h>
-#include <X11/Xatom.h>
+#include <xcb/xcb.h>
 
 #include "gdm-common.h"
 #include "gdm-display.h"
@@ -76,7 +75,8 @@
 
         guint                 finish_idle_id;
 
-        Display              *x11_display;
+        xcb_connection_t     *xcb_connection;
+        int                   xcb_screen_number;
 
         GDBusConnection      *connection;
         GdmDisplayAccessFile *user_access_file;
@@ -292,32 +292,17 @@
 }
 
 static void
-setup_xhost_auth (XHostAddress              *host_entries,
-                  XServerInterpretedAddress *si_entries)
+setup_xhost_auth (XHostAddress              *host_entries)
 {
-        si_entries[0].type        = "localuser";
-        si_entries[0].typelength  = strlen ("localuser");
-        si_entries[1].type        = "localuser";
-        si_entries[1].typelength  = strlen ("localuser");
-        si_entries[2].type        = "localuser";
-        si_entries[2].typelength  = strlen ("localuser");
-
-        si_entries[0].value       = "root";
-        si_entries[0].valuelength = strlen ("root");
-        si_entries[1].value       = GDM_USERNAME;
-        si_entries[1].valuelength = strlen (GDM_USERNAME);
-        si_entries[2].value       = "gnome-initial-setup";
-        si_entries[2].valuelength = strlen ("gnome-initial-setup");
-
         host_entries[0].family    = FamilyServerInterpreted;
-        host_entries[0].address   = (char *) &si_entries[0];
-        host_entries[0].length    = sizeof (XServerInterpretedAddress);
+        host_entries[0].address   = "localuser\0root";
+        host_entries[0].length    = sizeof ("localuser\0root");
         host_entries[1].family    = FamilyServerInterpreted;
-        host_entries[1].address   = (char *) &si_entries[1];
-        host_entries[1].length    = sizeof (XServerInterpretedAddress);
+        host_entries[1].address   = "localuser\0" GDM_USERNAME;
+        host_entries[1].length    = sizeof ("localuser\0" GDM_USERNAME);
         host_entries[2].family    = FamilyServerInterpreted;
-        host_entries[2].address   = (char *) &si_entries[2];
-        host_entries[2].length    = sizeof (XServerInterpretedAddress);
+        host_entries[2].address   = "localuser\0gnome-initial-setup";
+        host_entries[2].length    = sizeof ("localuser\0gnome-initial-setup");
 }
 
 gboolean
@@ -331,8 +316,8 @@
         gboolean              res;
 
         int                       i;
-        XServerInterpretedAddress si_entries[3];
         XHostAddress              host_entries[3];
+        xcb_void_cookie_t         cookies[3];
 
         g_return_val_if_fail (GDM_IS_DISPLAY (self), FALSE);
 
@@ -382,14 +367,25 @@
         /* Remove access for the programs run by greeter now that the
          * user session is starting.
          */
-        setup_xhost_auth (host_entries, si_entries);
-        gdm_error_trap_push ();
+        setup_xhost_auth (host_entries);
+
         for (i = 0; i < G_N_ELEMENTS (host_entries); i++) {
-                XRemoveHost (self->priv->x11_display, &host_entries[i]);
+                cookies[i] = xcb_change_hosts_checked 
(self->priv->xcb_connection,
+                                                       XCB_HOST_MODE_DELETE,
+                                                       host_entries[i].family,
+                                                       host_entries[i].length,
+                                                       (uint8_t *) 
host_entries[i].address);
         }
-        XSync (self->priv->x11_display, False);
-        if (gdm_error_trap_pop ()) {
-                g_warning ("Failed to remove greeter program access to the 
display. Trying to proceed.");
+
+        for (i = 0; i < G_N_ELEMENTS (cookies); i++) {
+                xcb_generic_error_t *xcb_error;
+
+                xcb_error = xcb_request_check (self->priv->xcb_connection, 
cookies[i]);
+
+                if (xcb_error != NULL) {
+                        g_warning ("Failed to remove greeter program access to 
the display. Trying to proceed.");
+                        free (xcb_error);
+                }
         }
 
         return TRUE;
@@ -649,6 +645,41 @@
         return TRUE;
 }
 
+static void
+gdm_display_disconnect (GdmDisplay *self)
+{
+        /* These 3 bits are reserved/unused by the X protocol */
+        guint32 unused_bits = 0b11100000000000000000000000000000;
+        XID highest_client, client;
+        guint32 client_increment;
+        const xcb_setup_t *setup;
+
+        if (self->priv->xcb_connection == NULL) {
+                return;
+        }
+
+        setup = xcb_get_setup (self->priv->xcb_connection);
+
+        /* resource_id_mask is the bits given to each client for
+         * addressing resources */
+        highest_client = (XID) ~unused_bits & ~setup->resource_id_mask;
+        client_increment = setup->resource_id_mask + 1;
+
+        /* Kill every client but ourselves, then close our own connection
+         */
+        for (client = 0;
+             client <= highest_client;
+             client += client_increment) {
+
+                if (client != setup->resource_id_base)
+                        xcb_kill_client (self->priv->xcb_connection, client);
+        }
+
+        xcb_flush (self->priv->xcb_connection);
+
+        g_clear_pointer (&self->priv->xcb_connection, xcb_disconnect);
+}
+
 gboolean
 gdm_display_unmanage (GdmDisplay *self)
 {
@@ -658,6 +689,8 @@
 
         g_debug ("GdmDisplay: unmanage display");
 
+        gdm_display_disconnect (self);
+
         g_timer_stop (self->priv->server_timer);
 
         if (self->priv->user_access_file != NULL) {
@@ -943,7 +976,7 @@
                 g_value_set_boolean (value, self->priv->is_local);
                 break;
         case PROP_IS_CONNECTED:
-                g_value_set_boolean (value, self->priv->x11_display != NULL);
+                g_value_set_boolean (value, self->priv->xcb_connection != 
NULL);
                 break;
         case PROP_LAUNCH_ENVIRONMENT:
                 g_value_set_object (value, self->priv->launch_environment);
@@ -1187,7 +1220,7 @@
                                                               
"x11-display-name",
                                                               
"x11-display-name",
                                                               NULL,
-                                                              
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+                                                              
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
         g_object_class_install_property (object_class,
                                          PROP_SEAT_ID,
                                          g_param_spec_string ("seat-id",
@@ -1593,70 +1626,78 @@
         }
 }
 
+static xcb_window_t
+get_root_window (xcb_connection_t *connection,
+                 int               screen_number)
+{
+        xcb_screen_t *screen = NULL;
+        xcb_screen_iterator_t iter;
+
+        iter = xcb_setup_roots_iterator (xcb_get_setup (connection));
+        while (iter.rem) {
+                if (screen_number == 0)
+                        screen = iter.data;
+                screen_number--;
+                xcb_screen_next (&iter);
+        }
+
+        if (screen != NULL) {
+                return screen->root;
+        }
+
+        return XCB_WINDOW_NONE;
+}
+
 static void
 gdm_display_set_windowpath (GdmDisplay *self)
 {
         /* setting WINDOWPATH for clients */
-        Atom prop;
-        Atom actualtype;
-        int actualformat;
-        unsigned long nitems;
-        unsigned long bytes_after;
-        unsigned char *buf;
+        xcb_intern_atom_cookie_t atom_cookie;
+        xcb_intern_atom_reply_t *atom_reply = NULL;
+        xcb_get_property_cookie_t get_property_cookie;
+        xcb_get_property_reply_t *get_property_reply = NULL;
+        xcb_window_t root_window = XCB_WINDOW_NONE;
         const char *windowpath;
         char *newwindowpath;
-        unsigned long num;
+        uint32_t num;
         char nums[10];
         int numn;
 
-        prop = XInternAtom (self->priv->x11_display, "XFree86_VT", False);
-        if (prop == None) {
+        atom_cookie = xcb_intern_atom (self->priv->xcb_connection, 0, 
strlen("XFree86_VT"), "XFree86_VT");
+        atom_reply = xcb_intern_atom_reply (self->priv->xcb_connection, 
atom_cookie, NULL);
+
+        if (atom_reply == NULL) {
                 g_debug ("no XFree86_VT atom\n");
-                return;
-        }
-        if (XGetWindowProperty (self->priv->x11_display,
-                DefaultRootWindow (self->priv->x11_display), prop, 0, 1,
-                False, AnyPropertyType, &actualtype, &actualformat,
-                &nitems, &bytes_after, &buf)) {
-                g_debug ("no XFree86_VT property\n");
-                return;
+                goto out;
         }
 
-        if (nitems != 1) {
-                g_debug ("%lu items in XFree86_VT property!\n", nitems);
-                XFree (buf);
-                return;
+        root_window = get_root_window (self->priv->xcb_connection,
+                                       self->priv->xcb_screen_number);
+
+        if (root_window == XCB_WINDOW_NONE) {
+                g_debug ("couldn't find root window\n");
+                goto out;
         }
 
-        switch (actualtype) {
-        case XA_CARDINAL:
-        case XA_INTEGER:
-        case XA_WINDOW:
-                switch (actualformat) {
-                case  8:
-                        num = (*(uint8_t  *)(void *)buf);
-                        break;
-                case 16:
-                        num = (*(uint16_t *)(void *)buf);
-                        break;
-                case 32:
-                        num = (*(long *)(void *)buf);
-                        break;
-                default:
-                        g_debug ("format %d in XFree86_VT property!\n", 
actualformat);
-                        XFree (buf);
-                        return;
-                }
-                break;
-        default:
-                g_debug ("type %lx in XFree86_VT property!\n", actualtype);
-                XFree (buf);
-                return;
+        get_property_cookie = xcb_get_property (self->priv->xcb_connection,
+                                                FALSE,
+                                                root_window,
+                                                atom_reply->atom,
+                                                XCB_ATOM_INTEGER,
+                                                0,
+                                                1);
+
+        get_property_reply = xcb_get_property_reply 
(self->priv->xcb_connection, get_property_cookie, NULL);
+
+        if (get_property_reply == NULL) {
+                g_debug ("no XFree86_VT property\n");
+                goto out;
         }
-        XFree (buf);
+
+        num = ((uint32_t *) xcb_get_property_value (get_property_reply))[0];
 
         windowpath = getenv ("WINDOWPATH");
-        numn = snprintf (nums, sizeof (nums), "%lu", num);
+        numn = snprintf (nums, sizeof (nums), "%u", num);
         if (!windowpath) {
                 newwindowpath = malloc (numn + 1);
                 sprintf (newwindowpath, "%s", nums);
@@ -1666,11 +1707,15 @@
         }
 
         g_setenv ("WINDOWPATH", newwindowpath, TRUE);
+out:
+        g_clear_pointer (&atom_reply, free);
+        g_clear_pointer (&get_property_reply, free);
 }
 
 gboolean
 gdm_display_connect (GdmDisplay *self)
 {
+        xcb_auth_info_t *auth_info = NULL;
         gboolean ret;
 
         ret = FALSE;
@@ -1679,21 +1724,26 @@
 
         /* Get access to the display independent of current hostname */
         if (self->priv->x11_cookie != NULL) {
-                XSetAuthorization ("MIT-MAGIC-COOKIE-1",
-                                   strlen ("MIT-MAGIC-COOKIE-1"),
-                                   (gpointer)
-                                   self->priv->x11_cookie,
-                                   self->priv->x11_cookie_size);
+                auth_info = g_alloca (sizeof (xcb_auth_info_t));
+
+                auth_info->namelen = strlen ("MIT-MAGIC-COOKIE-1");
+                auth_info->name = "MIT-MAGIC-COOKIE-1";
+                auth_info->datalen = self->priv->x11_cookie_size;
+                auth_info->data = self->priv->x11_cookie;
+
         }
 
-        self->priv->x11_display = XOpenDisplay (self->priv->x11_display_name);
+        self->priv->xcb_connection = xcb_connect_to_display_with_auth_info 
(self->priv->x11_display_name,
+                                                                            
auth_info,
+                                                                            
&self->priv->xcb_screen_number);
 
-        if (self->priv->x11_display == NULL) {
+        if (xcb_connection_has_error (self->priv->xcb_connection)) {
+                g_clear_pointer (&self->priv->xcb_connection, xcb_disconnect);
                 g_warning ("Unable to connect to display %s", 
self->priv->x11_display_name);
                 ret = FALSE;
         } else if (self->priv->is_local) {
-                XServerInterpretedAddress si_entries[3];
                 XHostAddress              host_entries[3];
+                xcb_void_cookie_t         cookies[3];
                 int                       i;
 
                 g_debug ("GdmDisplay: Connected to display %s", 
self->priv->x11_display_name);
@@ -1701,17 +1751,27 @@
 
                 /* Give programs access to the display independent of current 
hostname
                  */
-                setup_xhost_auth (host_entries, si_entries);
-
-                gdm_error_trap_push ();
+                setup_xhost_auth (host_entries);
 
                 for (i = 0; i < G_N_ELEMENTS (host_entries); i++) {
-                        XAddHost (self->priv->x11_display, &host_entries[i]);
+                        cookies[i] = xcb_change_hosts_checked 
(self->priv->xcb_connection,
+                                                               
XCB_HOST_MODE_INSERT,
+                                                               
host_entries[i].family,
+                                                               
host_entries[i].length,
+                                                               (uint8_t *) 
host_entries[i].address);
                 }
 
-                XSync (self->priv->x11_display, False);
-                if (gdm_error_trap_pop ()) {
-                        g_debug ("Failed to give some system users access to 
the display. Trying to proceed.");
+                for (i = 0; i < G_N_ELEMENTS (cookies); i++) {
+                        xcb_generic_error_t *xcb_error;
+
+                        xcb_error = xcb_request_check 
(self->priv->xcb_connection, cookies[i]);
+
+                        if (xcb_error != NULL) {
+                                g_debug ("Failed to give system user '%s' 
access to the display. Trying to proceed.", host_entries[i].address + sizeof 
("localuser"));
+                                free (xcb_error);
+                        } else {
+                                g_debug ("Gave system user '%s' access to the 
display.", host_entries[i].address + sizeof ("localuser"));
+                        }
                 }
 
                 gdm_display_set_windowpath (self);
diff -Nru gdm3-3.22.1/daemon/gdm-local-display-factory.c 
gdm3-3.22.3/daemon/gdm-local-display-factory.c
--- gdm3-3.22.1/daemon/gdm-local-display-factory.c      2016-09-21 
21:27:20.000000000 +0200
+++ gdm3-3.22.3/daemon/gdm-local-display-factory.c      2017-03-01 
16:58:36.000000000 +0100
@@ -206,7 +206,17 @@
 
         g_debug ("GdmLocalDisplayFactory: Creating transient display");
 
+#ifdef ENABLE_USER_DISPLAY_SERVER
         display = gdm_local_display_new ();
+#else
+        if (display == NULL) {
+                guint32 num;
+
+                num = take_next_display_number (factory);
+
+                display = gdm_legacy_display_new (num);
+        }
+#endif
 
         g_object_set (display,
                       "seat-id", "seat0"
@@ -358,13 +368,14 @@
 
         g_debug ("GdmLocalDisplayFactory: Adding display on seat %s", seat_id);
 
-
+#ifdef ENABLE_USER_DISPLAY_SERVER
         if (g_strcmp0 (seat_id, "seat0") == 0) {
                 display = gdm_local_display_new ();
                 if (session_type != NULL) {
                         g_object_set (G_OBJECT (display), "session-type", 
session_type, NULL);
                 }
         }
+#endif
 
         if (display == NULL) {
                 guint32 num;
diff -Nru gdm3-3.22.1/daemon/gdm-manager.c gdm3-3.22.3/daemon/gdm-manager.c
--- gdm3-3.22.1/daemon/gdm-manager.c    2016-09-21 21:27:20.000000000 +0200
+++ gdm3-3.22.3/daemon/gdm-manager.c    2017-03-03 21:32:43.000000000 +0100
@@ -618,10 +618,12 @@
 
         if (existing_session != NULL) {
                 ssid_to_activate = gdm_session_get_session_id 
(existing_session);
-                res = activate_session_id (manager, seat_id, ssid_to_activate);
-                if (! res) {
-                        g_debug ("GdmManager: unable to activate session: %s", 
ssid_to_activate);
-                        goto out;
+                if (seat_id != NULL) {
+                        res = activate_session_id (manager, seat_id, 
ssid_to_activate);
+                        if (! res) {
+                                g_debug ("GdmManager: unable to activate 
session: %s", ssid_to_activate);
+                                goto out;
+                        }
                 }
 
                 res = session_unlock (manager, ssid_to_activate);
@@ -781,8 +783,10 @@
         if (session != NULL) {
                 GPid pid;
 
-                if (x11_display_name != NULL)
+                if (x11_display_name != NULL) {
                         g_object_set (G_OBJECT (session), "display-name", 
x11_display_name, NULL);
+                        g_object_set (G_OBJECT (display), "x11-display-name", 
x11_display_name, NULL);
+                }
 
                 /* FIXME: this should happen in gdm-session.c when the session 
is opened
                  */
@@ -1329,9 +1333,6 @@
         GdmSession *session;
         char       *display_session_type = NULL;
         gboolean is_initial;
-#ifdef ENABLE_WAYLAND_SUPPORT
-        gboolean greeter_would_have_been_wayland;
-#endif
 
         /* 0 is root user; since the daemon talks to the session object
          * directly, itself, for automatic login
@@ -1343,15 +1344,8 @@
                       "session-type", &display_session_type,
                       NULL);
 
-#ifdef ENABLE_WAYLAND_SUPPORT
-        greeter_would_have_been_wayland = g_strcmp0 (display_session_type, 
"wayland") == 0;
-#endif
-
         g_object_set (G_OBJECT (session),
                       "display-is-initial", is_initial,
-#ifdef ENABLE_WAYLAND_SUPPORT
-                      "ignore-wayland", !greeter_would_have_been_wayland,
-#endif
                       NULL);
 
         g_debug ("GdmManager: Starting automatic login conversation");
@@ -1362,13 +1356,8 @@
 set_up_greeter_session (GdmManager *manager,
                         GdmDisplay *display)
 {
-        GdmSession *session;
         const char *allowed_user;
         struct passwd *passwd_entry;
-#ifdef ENABLE_WAYLAND_SUPPORT
-        char       *display_session_type = NULL;
-        gboolean greeter_is_wayland;
-#endif
 
         allowed_user = get_username_for_greeter_display (manager, display);
 
@@ -1380,20 +1369,7 @@
                 return;
         }
 
-        session = create_embryonic_user_session_for_display (manager, display, 
passwd_entry->pw_uid);
-
-#ifdef ENABLE_WAYLAND_SUPPORT
-        /* If the greeter display isn't a wayland session,
-         * then don't allow the user session to be a wayland
-         * session either.
-         */
-        g_object_get (G_OBJECT (display),
-                      "session-type", &display_session_type,
-                      NULL);
-        greeter_is_wayland = g_strcmp0 (display_session_type, "wayland") == 0;
-        g_object_set (G_OBJECT (session), "ignore-wayland", 
!greeter_is_wayland, NULL);
-#endif
-
+        create_embryonic_user_session_for_display (manager, display, 
passwd_entry->pw_uid);
         gdm_display_start_greeter_session (display);
 }
 
@@ -1759,6 +1735,15 @@
 }
 
 static void
+on_session_start_failed (GdmSession *session,
+                         const char *service_name,
+                         GdmManager *manager)
+{
+        g_debug ("GdmManager: session failed to start");
+        remove_user_session (manager, session);
+}
+
+static void
 on_user_session_exited (GdmSession *session,
                         int         code,
                         GdmManager *manager)
@@ -2060,6 +2045,10 @@
         char       *display_auth_file = NULL;
         char       *display_seat_id = NULL;
         char       *display_id = NULL;
+#ifdef ENABLE_WAYLAND_SUPPORT
+        char       *display_session_type = NULL;
+        gboolean    greeter_is_wayland;
+#endif
 
         g_object_get (G_OBJECT (display),
                       "id", &display_id,
@@ -2068,6 +2057,9 @@
                       "remote-hostname", &remote_hostname,
                       "x11-authority-file", &display_auth_file,
                       "seat-id", &display_seat_id,
+#ifdef ENABLE_WAYLAND_SUPPORT
+                      "session-type", &display_session_type,
+#endif
                       NULL);
         display_device = get_display_device (manager, display);
 
@@ -2130,6 +2122,10 @@
                           G_CALLBACK (on_user_session_started),
                           manager);
         g_signal_connect (session,
+                          "session-start-failed",
+                          G_CALLBACK (on_session_start_failed),
+                          manager);
+        g_signal_connect (session,
                           "session-exited",
                           G_CALLBACK (on_user_session_exited),
                           manager);
@@ -2143,6 +2139,12 @@
                                 g_object_ref (session),
                                 (GDestroyNotify)
                                 clean_embryonic_user_session);
+
+#ifdef ENABLE_WAYLAND_SUPPORT
+        greeter_is_wayland = g_strcmp0 (display_session_type, "wayland") == 0;
+        g_object_set (G_OBJECT (session), "ignore-wayland", 
!greeter_is_wayland, NULL);
+#endif
+
         return session;
 }
 
diff -Nru gdm3-3.22.1/daemon/gdm-manager-glue.c 
gdm3-3.22.3/daemon/gdm-manager-glue.c
--- gdm3-3.22.1/daemon/gdm-manager-glue.c       2016-10-12 20:00:32.000000000 
+0200
+++ gdm3-3.22.3/daemon/gdm-manager-glue.c       2017-02-27 22:45:47.000000000 
+0100
@@ -1,5 +1,5 @@
 /*
- * Generated by gdbus-codegen 2.49.6. DO NOT EDIT.
+ * Generated by gdbus-codegen 2.46.2. DO NOT EDIT.
  *
  * The license of this code is the same as for the source it was derived from.
  */
diff -Nru gdm3-3.22.1/daemon/gdm-manager-glue.h 
gdm3-3.22.3/daemon/gdm-manager-glue.h
--- gdm3-3.22.1/daemon/gdm-manager-glue.h       2016-10-12 20:00:32.000000000 
+0200
+++ gdm3-3.22.3/daemon/gdm-manager-glue.h       2017-02-27 22:45:47.000000000 
+0100
@@ -1,5 +1,5 @@
 /*
- * Generated by gdbus-codegen 2.49.6. DO NOT EDIT.
+ * Generated by gdbus-codegen 2.46.2. DO NOT EDIT.
  *
  * The license of this code is the same as for the source it was derived from.
  */
@@ -162,10 +162,6 @@
 
 GType gdm_dbus_manager_proxy_get_type (void) G_GNUC_CONST;
 
-#if GLIB_CHECK_VERSION(2, 44, 0)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdmDBusManagerProxy, g_object_unref)
-#endif
-
 void gdm_dbus_manager_proxy_new (
     GDBusConnection     *connection,
     GDBusProxyFlags      flags,
@@ -232,10 +228,6 @@
 
 GType gdm_dbus_manager_skeleton_get_type (void) G_GNUC_CONST;
 
-#if GLIB_CHECK_VERSION(2, 44, 0)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdmDBusManagerSkeleton, g_object_unref)
-#endif
-
 GdmDBusManager *gdm_dbus_manager_skeleton_new (void);
 
 
diff -Nru gdm3-3.22.1/daemon/gdm-session.c gdm3-3.22.3/daemon/gdm-session.c
--- gdm3-3.22.1/daemon/gdm-session.c    2016-09-21 21:27:21.000000000 +0200
+++ gdm3-3.22.3/daemon/gdm-session.c    2017-03-03 21:31:20.000000000 +0100
@@ -340,10 +340,9 @@
 static const char **
 get_system_session_dirs (GdmSession *self)
 {
-        static const char *search_dirs[] = {
-#ifdef ENABLE_WAYLAND_SUPPORT
-                DATADIR "/wayland-sessions/",
-#endif
+        static GArray *search_array = NULL;
+
+        static const char *x_search_dirs[] = {
                 "/etc/X11/sessions/",
                 DMCONFDIR "/Sessions/",
                 DATADIR "/gdm/BuiltInSessions/",
@@ -351,13 +350,25 @@
                 NULL
         };
 
+        static const char *wayland_search_dir = DATADIR "/wayland-sessions/";
+
+        if (search_array == NULL) {
+                search_array = g_array_new (TRUE, TRUE, sizeof (char *));
+
+                g_array_append_vals (search_array, x_search_dirs, G_N_ELEMENTS 
(x_search_dirs));
+
 #ifdef ENABLE_WAYLAND_SUPPORT
-        if (self->priv->ignore_wayland) {
-                return search_dirs + 1;
-        }
+                if (!self->priv->ignore_wayland) {
+#ifdef ENABLE_USER_DISPLAY_SERVER
+                        g_array_prepend_val (search_array, wayland_search_dir);
+#else
+                        g_array_append_val (search_array, wayland_search_dir);
 #endif
+                }
+#endif
+        }
 
-        return search_dirs;
+        return (const char **) search_array->data;
 }
 
 static gboolean
@@ -3102,6 +3113,7 @@
                 return GDM_SESSION_DISPLAY_MODE_REUSE_VT;
         }
 
+#ifdef ENABLE_USER_DISPLAY_SERVER
         /* All other cases (wayland login screen, X login screen,
          * wayland user session, X user session) use the NEW_VT
          * display mode.  That display mode means that GDM allocates
@@ -3124,6 +3136,18 @@
          *   are paused when handed out.
          */
         return GDM_SESSION_DISPLAY_MODE_NEW_VT;
+#else
+
+#ifdef ENABLE_WAYLAND_SUPPORT
+        /* Wayland sessions are for now assumed to run in a
+         * mutter-launch-like environment, so we allocate
+         * a new VT for them. */
+        if (g_strcmp0 (self->priv->session_type, "wayland") == 0) {
+                return GDM_SESSION_DISPLAY_MODE_NEW_VT;
+        }
+#endif
+        return GDM_SESSION_DISPLAY_MODE_REUSE_VT;
+#endif
 }
 
 void
diff -Nru gdm3-3.22.1/daemon/gdm-session-worker.c 
gdm3-3.22.3/daemon/gdm-session-worker.c
--- gdm3-3.22.1/daemon/gdm-session-worker.c     2016-09-21 21:27:21.000000000 
+0200
+++ gdm3-3.22.3/daemon/gdm-session-worker.c     2017-03-03 21:32:37.000000000 
+0100
@@ -1666,6 +1666,8 @@
                                              worker->priv->service,
                                              status);
 
+        killpg (pid, SIGHUP);
+
         worker->priv->child_pid = -1;
         worker->priv->child_watch_id = 0;
         run_script (worker, GDMCONFDIR "/PostSession");
@@ -1854,6 +1856,24 @@
                 jump_to_vt (worker, worker->priv->session_vt);
         }
 
+        if (!worker->priv->is_program_session && !run_script (worker, 
GDMCONFDIR "/PostLogin")) {
+                g_set_error (error,
+                             GDM_SESSION_WORKER_ERROR,
+                             GDM_SESSION_WORKER_ERROR_OPENING_SESSION,
+                             "Failed to execute PostLogin script");
+                error_code = PAM_ABORT;
+                goto out;
+        }
+
+        if (!worker->priv->is_program_session && !run_script (worker, 
GDMCONFDIR "/PreSession")) {
+                g_set_error (error,
+                             GDM_SESSION_WORKER_ERROR,
+                             GDM_SESSION_WORKER_ERROR_OPENING_SESSION,
+                             "Failed to execute PreSession script");
+                error_code = PAM_ABORT;
+                goto out;
+        }
+
         session_pid = fork ();
 
         if (session_pid < 0) {
@@ -2102,6 +2122,41 @@
 }
 
 static gboolean
+set_xdg_vtnr_to_current_vt (GdmSessionWorker *worker)
+{
+        int fd;
+        char vt_string[256];
+        struct vt_stat vt_state = { 0 };
+
+        fd = open ("/dev/tty0", O_RDWR | O_NOCTTY);
+
+        if (fd < 0) {
+                g_debug ("GdmSessionWorker: couldn't open VT master: %m");
+                return FALSE;
+        }
+
+        if (ioctl (fd, VT_GETSTATE, &vt_state) < 0) {
+                g_debug ("GdmSessionWorker: couldn't get current VT: %m");
+                goto fail;
+        }
+
+        close (fd);
+        fd = -1;
+
+        g_snprintf (vt_string, sizeof (vt_string), "%d", vt_state.v_active);
+
+        gdm_session_worker_set_environment_variable (worker,
+                                                     "XDG_VTNR",
+                                                     vt_string);
+
+        return TRUE;
+
+fail:
+        close (fd);
+        return FALSE;
+}
+
+static gboolean
 set_up_for_current_vt (GdmSessionWorker  *worker,
                        GError           **error)
 {
@@ -2166,6 +2221,14 @@
                 g_free (pam_xauth);
          }
 #endif
+
+        if (g_strcmp0 (worker->priv->display_seat_id, "seat0") == 0) {
+                g_debug ("GdmSessionWorker: setting XDG_VTNR to current vt");
+                set_xdg_vtnr_to_current_vt (worker);
+        } else {
+                g_debug ("GdmSessionWorker: not setting XDG_VTNR since not 
seat0");
+        }
+
         return TRUE;
 out:
         return FALSE;
@@ -2206,14 +2269,6 @@
                 flags |= PAM_SILENT;
         }
 
-        if (!run_script (worker, GDMCONFDIR "/PostLogin")) {
-                g_set_error (error,
-                             GDM_SESSION_WORKER_ERROR,
-                             GDM_SESSION_WORKER_ERROR_OPENING_SESSION,
-                             "Failed to execute PostLogin script");
-                return FALSE;
-        }
-
         error_code = pam_open_session (worker->priv->pam_handle, flags);
 
         if (error_code != PAM_SUCCESS) {
@@ -2229,14 +2284,6 @@
 
         session_id = gdm_session_worker_get_environment_variable (worker, 
"XDG_SESSION_ID");
 
-        /* FIXME: should we do something here?
-         * Note that error return status from PreSession script should
-         * be ignored in the case of a X-GDM-BypassXsession session, which can
-         * be checked by calling:
-         * gdm_session_bypasses_xsession (session)
-         */
-        run_script (worker, GDMCONFDIR "/PreSession");
-
         if (session_id != NULL) {
                 g_free (worker->priv->session_id);
                 worker->priv->session_id = session_id;
diff -Nru gdm3-3.22.1/daemon/gdm-wayland-session.c 
gdm3-3.22.3/daemon/gdm-wayland-session.c
--- gdm3-3.22.1/daemon/gdm-wayland-session.c    2016-09-21 21:54:52.000000000 
+0200
+++ gdm3-3.22.3/daemon/gdm-wayland-session.c    2017-03-01 21:58:01.000000000 
+0100
@@ -301,7 +301,7 @@
                 for (i = 0; state->environment[i] != NULL; i++) {
                         g_auto(GStrv) environment_entry = NULL;
 
-                        if (state->environment[i] == '\0') {
+                        if (state->environment[i][0] == '\0') {
                                 continue;
                         }
 
diff -Nru gdm3-3.22.1/daemon/gdm-xdmcp-display-factory.c 
gdm3-3.22.3/daemon/gdm-xdmcp-display-factory.c
--- gdm3-3.22.1/daemon/gdm-xdmcp-display-factory.c      2016-09-21 
21:27:21.000000000 +0200
+++ gdm3-3.22.3/daemon/gdm-xdmcp-display-factory.c      2017-03-01 
21:58:01.000000000 +0100
@@ -210,7 +210,10 @@
 static void     gdm_xdmcp_display_factory_class_init    
(GdmXdmcpDisplayFactoryClass *klass);
 static void     gdm_xdmcp_display_factory_init          
(GdmXdmcpDisplayFactory      *manager);
 static void     gdm_xdmcp_display_factory_finalize      (GObject               
      *object);
-
+static void     gdm_xdmcp_send_alive (GdmXdmcpDisplayFactory *factory,
+                                      GdmAddress             *address,
+                                      CARD16                  dspnum,
+                                      CARD32                  sessid);
 static gpointer xdmcp_display_factory_object = NULL;
 
 G_DEFINE_TYPE (GdmXdmcpDisplayFactory, gdm_xdmcp_display_factory, 
GDM_TYPE_DISPLAY_FACTORY)
@@ -2065,6 +2068,9 @@
         GdmDisplayStore *store;
         GdmLaunchEnvironment *launch_environment;
         GdmSession *session;
+        GdmAddress *address;
+        gint32  session_number;
+        int display_number;
 
         store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY 
(factory));
 
@@ -2081,6 +2087,13 @@
         g_debug ("GdmXdmcpDisplayFactory: xdmcp display status changed: %d", 
status);
         switch (status) {
         case GDM_DISPLAY_FINISHED:
+                g_object_get (display,
+                              "remote-address", &address,
+                              "x11-display-number", &display_number,
+                              "session-number", &session_number,
+                              NULL);
+                gdm_xdmcp_send_alive (factory, address, display_number, 
session_number);
+
                 gdm_display_store_remove (store, display);
                 break;
         case GDM_DISPLAY_FAILED:
diff -Nru gdm3-3.22.1/daemon/gdm-x-session.c gdm3-3.22.3/daemon/gdm-x-session.c
--- gdm3-3.22.1/daemon/gdm-x-session.c  2016-09-21 21:27:21.000000000 +0200
+++ gdm3-3.22.3/daemon/gdm-x-session.c  2017-03-02 22:33:50.000000000 +0100
@@ -619,7 +619,7 @@
                 for (i = 0; state->environment[i] != NULL; i++) {
                         g_auto(GStrv) environment_entry = NULL;
 
-                        if (state->environment[i] == '\0') {
+                        if (state->environment[i][0] == '\0') {
                                 continue;
                         }
 
diff -Nru gdm3-3.22.1/debian/changelog gdm3-3.22.3/debian/changelog
--- gdm3-3.22.1/debian/changelog        2017-01-29 12:07:50.000000000 +0100
+++ gdm3-3.22.3/debian/changelog        2017-05-09 23:51:57.000000000 +0200
@@ -1,3 +1,31 @@
+gdm3 (3.22.3-2) unstable; urgency=medium
+
+  [ Laurent Bigonville ]
+  * d/p/stop-greeter-explicitly-when-finishing-display.patch: Properly stop
+    the greeter processes when restarting gdm, this fixes the respawn loop and
+    allow gdm to restart properly (Closes: #857995)
+
+  [ Michael Biebl ]
+  * Setup pulseaudio to run as systemd user service for Debian-gdm.
+    Otherwise, if we start pulseaudio within the session, the idle-timeout of
+    pulseaudio will prevent the old session scope to be properly terminated
+    when the gdm service is restarted and the old logind session will remain
+    in state "closing".
+
+ -- Michael Biebl <bi...@debian.org>  Tue, 09 May 2017 23:51:57 +0200
+
+gdm3 (3.22.3-1) unstable; urgency=medium
+
+  * New upstream release.
+  * Refresh patches.
+  * Add Build-Depends on libxcb1-dev. Upstream switched from xlib to xcb for
+    the main gdm process to be more robust in cases where the display
+    connection has gone away.
+  * Use --with-pam-mod-dir configure switch to set the location of the pam
+    module directory instead of moving the .so file around manually.
+
+ -- Michael Biebl <bi...@debian.org>  Thu, 16 Mar 2017 21:46:47 +0100
+
 gdm3 (3.22.1-2) unstable; urgency=medium
 
   * Team upload.
diff -Nru gdm3-3.22.1/debian/control gdm3-3.22.3/debian/control
--- gdm3-3.22.1/debian/control  2017-01-29 12:07:50.000000000 +0100
+++ gdm3-3.22.3/debian/control  2017-05-09 23:51:57.000000000 +0200
@@ -21,6 +21,7 @@
                gnome-settings-daemon-dev (>= 2.91.2),
                gnome-settings-daemon (>= 2.91.2),
                libnss3-dev (>= 3.11.1),
+               libxcb1-dev,
                libx11-dev,
                libxau-dev,
                libxt-dev,
diff -Nru gdm3-3.22.1/debian/control.in gdm3-3.22.3/debian/control.in
--- gdm3-3.22.1/debian/control.in       2016-10-16 22:56:47.000000000 +0200
+++ gdm3-3.22.3/debian/control.in       2017-03-16 20:23:49.000000000 +0100
@@ -17,6 +17,7 @@
                gnome-settings-daemon-dev (>= 2.91.2),
                gnome-settings-daemon (>= 2.91.2),
                libnss3-dev (>= 3.11.1),
+               libxcb1-dev,
                libx11-dev,
                libxau-dev,
                libxt-dev,
diff -Nru gdm3-3.22.1/debian/gdm3.install gdm3-3.22.3/debian/gdm3.install
--- gdm3-3.22.1/debian/gdm3.install     2016-09-22 15:03:43.000000000 +0200
+++ gdm3-3.22.3/debian/gdm3.install     2017-03-16 20:44:52.000000000 +0100
@@ -1,5 +1,6 @@
 etc/*
-lib
+lib/systemd/
+lib/*/security/*.so
 usr/bin/gdm-screenshot
 usr/lib/gdm3/gdm-*
 # gets renamed to gdm3 in binary-install
diff -Nru gdm3-3.22.1/debian/gdm3.postinst gdm3-3.22.3/debian/gdm3.postinst
--- gdm3-3.22.1/debian/gdm3.postinst    2016-10-16 23:03:42.000000000 +0200
+++ gdm3-3.22.3/debian/gdm3.postinst    2017-05-09 23:51:35.000000000 +0200
@@ -80,6 +80,14 @@
 # debconf hangs if gdm3 gets started below without this
 db_stop || true
 
+# Setup pulseaudio to run as user service
+UNIT=/usr/lib/systemd/user/pulseaudio.socket
+USERUNITDIR=/var/lib/gdm3/.config/systemd/user
+if ! [ -L $USERUNITDIR/sockets.target.wants/pulseaudio.socket ]; then
+  mkdir -p $USERUNITDIR/sockets.target.wants
+  ln -sf $UNIT $USERUNITDIR/sockets.target.wants
+fi
+
 chown -R Debian-gdm:Debian-gdm /var/lib/gdm3
 
 if [ -L /etc/pam.d/gdm-welcome ]; then
diff -Nru gdm3-3.22.1/debian/patches/09_default_session.patch 
gdm3-3.22.3/debian/patches/09_default_session.patch
--- gdm3-3.22.1/debian/patches/09_default_session.patch 2016-04-20 
00:43:51.000000000 +0200
+++ gdm3-3.22.3/debian/patches/09_default_session.patch 2017-03-16 
20:21:10.000000000 +0100
@@ -1,11 +1,11 @@
 Description: Prefer "default.desktop", so that other desktop environments like 
XFCE can use gdm, too, without being forced to start GNOME.
 Ubuntu: https://launchpad.net/bugs/403291
 Upstream: https://bugzilla.gnome.org/show_bug.cgi?id=594733
-Index: gdm-3.20.1/daemon/gdm-session.c
+Index: b/daemon/gdm-session.c
 ===================================================================
---- gdm-3.20.1.orig/daemon/gdm-session.c       2016-04-20 00:34:53.144038467 
+0200
-+++ gdm-3.20.1/daemon/gdm-session.c    2016-04-20 00:35:20.820367810 +0200
-@@ -523,7 +523,7 @@
+--- a/daemon/gdm-session.c
++++ b/daemon/gdm-session.c
+@@ -534,7 +534,7 @@
                  }
          }
  
diff -Nru gdm3-3.22.1/debian/patches/16_xserver_path.patch 
gdm3-3.22.3/debian/patches/16_xserver_path.patch
--- gdm3-3.22.1/debian/patches/16_xserver_path.patch    2016-10-16 
22:56:08.000000000 +0200
+++ gdm3-3.22.3/debian/patches/16_xserver_path.patch    2017-03-16 
20:21:13.000000000 +0100
@@ -2,7 +2,7 @@
 ===================================================================
 --- a/configure.ac
 +++ b/configure.ac
-@@ -1196,7 +1196,10 @@
+@@ -1207,7 +1207,10 @@
  # and /usr/X11 since they often symlink to each other, and configure
  # should use the more stable location (the real directory) if possible.
  #
diff -Nru 
gdm3-3.22.1/debian/patches/Hack-D-Bus-messages-from-Debian-8-libgdm-to-work-wit.patch
 
gdm3-3.22.3/debian/patches/Hack-D-Bus-messages-from-Debian-8-libgdm-to-work-wit.patch
--- 
gdm3-3.22.1/debian/patches/Hack-D-Bus-messages-from-Debian-8-libgdm-to-work-wit.patch
       2017-01-29 02:59:22.000000000 +0100
+++ 
gdm3-3.22.3/debian/patches/Hack-D-Bus-messages-from-Debian-8-libgdm-to-work-wit.patch
       2017-03-16 20:21:38.000000000 +0100
@@ -14,11 +14,11 @@
  daemon/gdm-session-worker.c | 81 +++++++++++++++++++++++++++++++++++++++++++++
  1 file changed, 81 insertions(+)
 
-diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
-index 421ef028..6b14f003 100644
+Index: b/daemon/gdm-session-worker.c
+===================================================================
 --- a/daemon/gdm-session-worker.c
 +++ b/daemon/gdm-session-worker.c
-@@ -3077,6 +3077,80 @@ gdm_session_worker_handle_start_reauthentication 
(GdmDBusWorker         *object,
+@@ -3122,6 +3122,80 @@
          return TRUE;
  }
  
@@ -99,7 +99,7 @@
  static GObject *
  gdm_session_worker_constructor (GType                  type,
                                  guint                  n_construct_properties,
-@@ -3104,6 +3178,13 @@ gdm_session_worker_constructor (GType                  
type,
+@@ -3149,6 +3223,13 @@
                  exit (1);
          }
  
@@ -113,6 +113,3 @@
          worker->priv->manager = GDM_DBUS_WORKER_MANAGER 
(gdm_dbus_worker_manager_proxy_new_sync (worker->priv->connection,
                                                                                
                   G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
                                                                                
                   NULL, /* dbus name */
--- 
-2.11.0
-
diff -Nru 
gdm3-3.22.1/debian/patches/pam_gdm-allow-setting-pam-module-dir-at-configure-ti.patch
 
gdm3-3.22.3/debian/patches/pam_gdm-allow-setting-pam-module-dir-at-configure-ti.patch
--- 
gdm3-3.22.1/debian/patches/pam_gdm-allow-setting-pam-module-dir-at-configure-ti.patch
       1970-01-01 01:00:00.000000000 +0100
+++ 
gdm3-3.22.3/debian/patches/pam_gdm-allow-setting-pam-module-dir-at-configure-ti.patch
       2017-03-16 20:43:47.000000000 +0100
@@ -0,0 +1,63 @@
+From 5ed388af0ab4c62dc51efbb4cf3345d8fa634fca Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?R=C3=A9mi=20Cardona?= <r...@gentoo.org>
+Date: Mon, 21 Nov 2016 08:18:32 +0100
+Subject: [PATCH] pam_gdm: allow setting pam module dir at configure time
+
+Code taken almost verbatim from gnome-keyring.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=774776
+(cherry picked from commit c6633b311f7ed8560a5c6847110d872d017672a6)
+---
+ configure.ac        | 11 ++++++++++-
+ pam_gdm/Makefile.am |  2 +-
+ 2 files changed, 11 insertions(+), 2 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 6613097b..e09831ad 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -487,7 +487,7 @@ dnl 
---------------------------------------------------------------------------
+ dnl - Check for PAM stuff
+ dnl 
---------------------------------------------------------------------------
+ 
+-dnl PAM prefix
++dnl PAM prefix (configuration files)
+ withval=""
+ AC_ARG_WITH(pam-prefix,
+             AS_HELP_STRING([--with-pam-prefix=<prefix>],
+@@ -503,6 +503,14 @@ else
+ fi
+ AC_SUBST(PAM_PREFIX)
+ 
++dnl PAM dir (dynamic modules)
++AC_ARG_WITH([pam-mod-dir],
++            [AS_HELP_STRING([--with-pam-mod-dir=DIR],
++                            [directory to install pam modules in])],
++            [], [with_pam_mod_dir='${libdir}/security'])
++PAM_MOD_DIR="$with_pam_mod_dir"
++AC_SUBST(PAM_MOD_DIR)
++
+ have_pam=no
+ AC_CHECK_LIB(pam, pam_start, have_pam=yes)
+ 
+@@ -1592,6 +1600,7 @@ echo "
+ 
+         dbus-1 system.d dir:      ${DBUS_SYS_DIR}
+         PAM prefix:               ${PAM_PREFIX}
++        PAM module dir:           ${PAM_MOD_DIR}
+         PAM config:               ${with_default_pam_config}
+         X server:                 ${X_SERVER}
+ "
+diff --git a/pam_gdm/Makefile.am b/pam_gdm/Makefile.am
+index 61d672b4..6b92cfcf 100644
+--- a/pam_gdm/Makefile.am
++++ b/pam_gdm/Makefile.am
+@@ -36,4 +36,4 @@ pam_gdm_LTLIBRARIES = \
+       pam_gdm.la \
+       $(END_OF_LIST)
+ 
+-pam_gdmdir = $(libdir)/security
++pam_gdmdir = $(PAM_MOD_DIR)
+-- 
+2.11.0
+
diff -Nru gdm3-3.22.1/debian/patches/series gdm3-3.22.3/debian/patches/series
--- gdm3-3.22.1/debian/patches/series   2017-01-29 02:59:22.000000000 +0100
+++ gdm3-3.22.3/debian/patches/series   2017-05-09 23:27:40.000000000 +0200
@@ -5,3 +5,5 @@
 92_systemd_unit.patch
 94_retain_xorg_log.patch
 Hack-D-Bus-messages-from-Debian-8-libgdm-to-work-wit.patch
+pam_gdm-allow-setting-pam-module-dir-at-configure-ti.patch
+stop-greeter-explicitly-when-finishing-display.patch
diff -Nru 
gdm3-3.22.1/debian/patches/stop-greeter-explicitly-when-finishing-display.patch 
gdm3-3.22.3/debian/patches/stop-greeter-explicitly-when-finishing-display.patch
--- 
gdm3-3.22.1/debian/patches/stop-greeter-explicitly-when-finishing-display.patch 
    1970-01-01 01:00:00.000000000 +0100
+++ 
gdm3-3.22.3/debian/patches/stop-greeter-explicitly-when-finishing-display.patch 
    2017-05-09 23:27:10.000000000 +0200
@@ -0,0 +1,31 @@
+From 81f61eb4966e4652382ebee32f1830cfb4ca9126 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstr...@redhat.com>
+Date: Mon, 8 May 2017 12:40:00 -0400
+Subject: manager: stop greeter explicitly when finishing display
+
+If GDM shuts down while the login screen is active, we fail to
+kill off the login screen session.
+
+This commit fixes that, by explicitly stopping the greeter session
+on the display (if there is one)
+
+https://bugzilla.gnome.org/show_bug.cgi?id=780213
+---
+ daemon/gdm-manager.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
+index 994886f..d080b30 100644
+--- a/daemon/gdm-manager.c
++++ b/daemon/gdm-manager.c
+@@ -2736,6 +2736,7 @@ finish_display (const char *id,
+                 GdmDisplay *display,
+                 GdmManager *manager)
+ {
++        gdm_display_stop_greeter_session (display);
+         if (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED)
+                 gdm_display_unmanage (display);
+         gdm_display_finish (display);
+-- 
+cgit v0.12
+
diff -Nru gdm3-3.22.1/debian/rules gdm3-3.22.3/debian/rules
--- gdm3-3.22.1/debian/rules    2016-10-17 01:11:11.000000000 +0200
+++ gdm3-3.22.3/debian/rules    2017-03-16 20:45:12.000000000 +0100
@@ -61,6 +61,7 @@
                --with-xauth-dir=/var/run/gdm3 \
                --with-pid-file=/var/run/gdm3.pid \
                --with-log-dir=/var/log/gdm3 \
+               --with-pam-mod-dir=/lib/$(DEB_HOST_MULTIARCH)/security \
                --with-screenshot-dir=/var/run/gdm3/greeter \
                --with-defaults-conf=/usr/share/gdm/defaults.conf \
                --with-user=Debian-gdm --with-group=Debian-gdm \
@@ -86,8 +87,6 @@
        rm -rf debian/gdm3/var/run
        rm -rf debian/gdm3/usr/include
        rm -rf debian/gdm3/usr/lib/pkgconfig
-       mkdir -p debian/gdm3/lib/$(DEB_HOST_MULTIARCH)/security/
-       mv debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/security/pam_gdm.so 
debian/gdm3/lib/$(DEB_HOST_MULTIARCH)/security/
 
 override_dh_installinit:
        dh_installinit --noscripts
diff -Nru gdm3-3.22.1/libgdm/gdm-client-glue.h 
gdm3-3.22.3/libgdm/gdm-client-glue.h
--- gdm3-3.22.1/libgdm/gdm-client-glue.h        2016-10-12 20:00:32.000000000 
+0200
+++ gdm3-3.22.3/libgdm/gdm-client-glue.h        2017-02-27 22:45:58.000000000 
+0100
@@ -1,5 +1,5 @@
 /*
- * Generated by gdbus-codegen 2.49.6. DO NOT EDIT.
+ * Generated by gdbus-codegen 2.46.2. DO NOT EDIT.
  *
  * The license of this code is the same as for the source it was derived from.
  */
@@ -219,10 +219,6 @@
 
 GType gdm_worker_manager_proxy_get_type (void) G_GNUC_CONST;
 
-#if GLIB_CHECK_VERSION(2, 44, 0)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdmWorkerManagerProxy, g_object_unref)
-#endif
-
 void gdm_worker_manager_proxy_new (
     GDBusConnection     *connection,
     GDBusProxyFlags      flags,
@@ -289,10 +285,6 @@
 
 GType gdm_worker_manager_skeleton_get_type (void) G_GNUC_CONST;
 
-#if GLIB_CHECK_VERSION(2, 44, 0)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdmWorkerManagerSkeleton, g_object_unref)
-#endif
-
 GdmWorkerManager *gdm_worker_manager_skeleton_new (void);
 
 
@@ -564,10 +556,6 @@
 
 GType gdm_user_verifier_proxy_get_type (void) G_GNUC_CONST;
 
-#if GLIB_CHECK_VERSION(2, 44, 0)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdmUserVerifierProxy, g_object_unref)
-#endif
-
 void gdm_user_verifier_proxy_new (
     GDBusConnection     *connection,
     GDBusProxyFlags      flags,
@@ -634,10 +622,6 @@
 
 GType gdm_user_verifier_skeleton_get_type (void) G_GNUC_CONST;
 
-#if GLIB_CHECK_VERSION(2, 44, 0)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdmUserVerifierSkeleton, g_object_unref)
-#endif
-
 GdmUserVerifier *gdm_user_verifier_skeleton_new (void);
 
 
@@ -896,10 +880,6 @@
 
 GType gdm_greeter_proxy_get_type (void) G_GNUC_CONST;
 
-#if GLIB_CHECK_VERSION(2, 44, 0)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdmGreeterProxy, g_object_unref)
-#endif
-
 void gdm_greeter_proxy_new (
     GDBusConnection     *connection,
     GDBusProxyFlags      flags,
@@ -966,10 +946,6 @@
 
 GType gdm_greeter_skeleton_get_type (void) G_GNUC_CONST;
 
-#if GLIB_CHECK_VERSION(2, 44, 0)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdmGreeterSkeleton, g_object_unref)
-#endif
-
 GdmGreeter *gdm_greeter_skeleton_new (void);
 
 
@@ -1054,10 +1030,6 @@
 
 GType gdm_remote_greeter_proxy_get_type (void) G_GNUC_CONST;
 
-#if GLIB_CHECK_VERSION(2, 44, 0)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdmRemoteGreeterProxy, g_object_unref)
-#endif
-
 void gdm_remote_greeter_proxy_new (
     GDBusConnection     *connection,
     GDBusProxyFlags      flags,
@@ -1124,10 +1096,6 @@
 
 GType gdm_remote_greeter_skeleton_get_type (void) G_GNUC_CONST;
 
-#if GLIB_CHECK_VERSION(2, 44, 0)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdmRemoteGreeterSkeleton, g_object_unref)
-#endif
-
 GdmRemoteGreeter *gdm_remote_greeter_skeleton_new (void);
 
 
@@ -1239,10 +1207,6 @@
 
 GType gdm_chooser_proxy_get_type (void) G_GNUC_CONST;
 
-#if GLIB_CHECK_VERSION(2, 44, 0)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdmChooserProxy, g_object_unref)
-#endif
-
 void gdm_chooser_proxy_new (
     GDBusConnection     *connection,
     GDBusProxyFlags      flags,
@@ -1309,10 +1273,6 @@
 
 GType gdm_chooser_skeleton_get_type (void) G_GNUC_CONST;
 
-#if GLIB_CHECK_VERSION(2, 44, 0)
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdmChooserSkeleton, g_object_unref)
-#endif
-
 GdmChooser *gdm_chooser_skeleton_new (void);
 
 
diff -Nru gdm3-3.22.1/libgdm/gdm.pc gdm3-3.22.3/libgdm/gdm.pc
--- gdm3-3.22.1/libgdm/gdm.pc   2016-10-12 20:04:12.000000000 +0200
+++ gdm3-3.22.3/libgdm/gdm.pc   2017-03-06 18:10:31.000000000 +0100
@@ -5,6 +5,6 @@
 
 Name: GDM Client Library
 Description: Client Library for communicating with GDM daemon
-Version: 3.22.1
+Version: 3.22.3
 Libs: -L${libdir} -lgdm
 Cflags: -I${includedir}/gdm
diff -Nru gdm3-3.22.1/NEWS gdm3-3.22.3/NEWS
--- gdm3-3.22.1/NEWS    2016-10-12 19:58:19.000000000 +0200
+++ gdm3-3.22.3/NEWS    2017-03-06 18:08:14.000000000 +0100
@@ -1,4 +1,21 @@
 ==============
+Version 3.22.3
+==============
+- Fix regression in wayland fallback code
+- Fix for headless sessions
+- Change around how PostLogin/PostSession scripts are run
+- Fix XDMCP in network environments with poor network resolution
+- Don't try to user switch with XDMCP
+
+==============
+Version 3.22.2
+==============
+- Fix book keeping of display name in some cases
+- wayland fix
+- xdmcp logout fix
+- add knob to go back to running Xorg as root
+
+==============
 Version 3.22.1
 ==============
 - Fix wayland login after Xorg logout for a user

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to