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 <biebl@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 <biebl@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?= <remi@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 <rstrode@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