diff --git a/gdm-kill-user-session.patch b/gdm-kill-user-session.patch new file mode 100644 index 0000000..a3c2ecd --- /dev/null +++ b/gdm-kill-user-session.patch @@ -0,0 +1,264 @@ +diff --git a/daemon/gdm-display-store.c b/daemon/gdm-display-store.c +index fd24334..8c1ae25 100644 +--- a/daemon/gdm-display-store.c ++++ b/daemon/gdm-display-store.c +@@ -136,6 +136,35 @@ typedef struct + gpointer user_data; + } FindClosure; + ++static void ++copy_func (StoredDisplay *stored_display, ++ FindClosure *closure) ++{ ++ closure->user_data = g_list_append (closure->user_data, ++ stored_display->display); ++} ++ ++GList * ++gdm_display_store_get_displays (GdmDisplayStore *store) ++{ ++ GList *displays = NULL; ++ GList *store_displays = NULL; ++ FindClosure closure; ++ g_return_val_if_fail (store != NULL, NULL); ++ ++ store_displays = g_hash_table_get_values (store->priv->displays); ++ ++ closure.user_data = displays; ++ ++ g_list_foreach (store_displays, ++ (GFunc) copy_func, ++ &closure); ++ displays = closure.user_data; ++ ++ g_list_free (store_displays); ++ return displays; ++} ++ + static gboolean + find_func (const char *id, + StoredDisplay *stored_display, +diff --git a/daemon/gdm-display-store.h b/daemon/gdm-display-store.h +index 0aff8ee..cd69518 100644 +--- a/daemon/gdm-display-store.h ++++ b/daemon/gdm-display-store.h +@@ -86,6 +86,8 @@ GdmDisplay * gdm_display_store_find (GdmDisplayStore + GdmDisplayStoreFunc predicate, + gpointer user_data); + ++GList * gdm_display_store_get_displays (GdmDisplayStore *store); ++ + + G_END_DECLS + +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index cb9f662..a971ba3 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -2703,9 +2703,7 @@ unexport_display (const char *id, + } + + static void +-finish_display (const char *id, +- GdmDisplay *display, +- GdmManager *manager) ++finish_display (GdmDisplay *display) + { + gdm_display_stop_greeter_session (display); + if (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED) +@@ -2717,6 +2715,7 @@ static void + gdm_manager_dispose (GObject *object) + { + GdmManager *manager; ++ GList *displays = NULL; + + g_return_if_fail (object != NULL); + g_return_if_fail (GDM_IS_MANAGER (object)); +@@ -2758,9 +2757,11 @@ gdm_manager_dispose (GObject *object) + g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (manager)); + } + +- gdm_display_store_foreach (manager->priv->display_store, +- (GdmDisplayStoreFunc) finish_display, +- manager); ++ displays = gdm_display_store_get_displays (manager->priv->display_store); ++ g_list_foreach (displays, ++ (GFunc) finish_display, ++ NULL); ++ g_list_free (displays); + + gdm_display_store_clear (manager->priv->display_store); + +diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c +index 06e5a6a..07642cd 100644 +--- a/daemon/gdm-session-worker.c ++++ b/daemon/gdm-session-worker.c +@@ -34,6 +34,7 @@ + #include + #include + #include ++#include + + #include + +@@ -181,6 +182,8 @@ struct GdmSessionWorkerPrivate + GdmSessionSettings *user_settings; + + GDBusMethodInvocation *pending_invocation; ++ ++ GMainLoop *main_loop; + }; + + #ifdef SUPPORTS_PAM_EXTENSIONS +@@ -197,6 +200,7 @@ enum { + PROP_0, + PROP_SERVER_ADDRESS, + PROP_IS_REAUTH_SESSION, ++ PROP_MAIN_LOOP, + }; + + static void gdm_session_worker_class_init (GdmSessionWorkerClass *klass); +@@ -2455,6 +2459,13 @@ gdm_session_worker_set_is_reauth_session (GdmSessionWorker *worker, + worker->priv->is_reauth_session = is_reauth_session; + } + ++static void ++gdm_session_worker_set_main_loop (GdmSessionWorker *worker, ++ GMainLoop *main_loop) ++{ ++ worker->priv->main_loop = main_loop; ++} ++ + static void + gdm_session_worker_set_property (GObject *object, + guint prop_id, +@@ -2472,6 +2483,9 @@ gdm_session_worker_set_property (GObject *object, + case PROP_IS_REAUTH_SESSION: + gdm_session_worker_set_is_reauth_session (self, g_value_get_boolean (value)); + break; ++ case PROP_MAIN_LOOP: ++ gdm_session_worker_set_main_loop (self, g_value_get_pointer (value)); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; +@@ -2495,6 +2509,9 @@ gdm_session_worker_get_property (GObject *object, + case PROP_IS_REAUTH_SESSION: + g_value_set_boolean (value, self->priv->is_reauth_session); + break; ++ case PROP_MAIN_LOOP: ++ g_value_set_pointer (value, self->priv->main_loop); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; +@@ -2764,6 +2781,16 @@ do_open_session (GdmSessionWorker *worker) + worker->priv->pending_invocation = NULL; + } + ++static gboolean ++on_shutdown_signal_cb (gpointer user_data) ++{ ++ GMainLoop *mainloop = user_data; ++ ++ g_main_loop_quit (mainloop); ++ ++ return FALSE; ++} ++ + static void + do_start_session (GdmSessionWorker *worker) + { +@@ -2773,6 +2800,9 @@ do_start_session (GdmSessionWorker *worker) + error = NULL; + res = gdm_session_worker_start_session (worker, &error); + if (res) { ++ g_unix_signal_add (SIGTERM, on_shutdown_signal_cb, worker->priv->main_loop); ++ g_unix_signal_add (SIGINT, on_shutdown_signal_cb, worker->priv->main_loop); ++ + gdm_dbus_worker_complete_start_program (GDM_DBUS_WORKER (worker), + worker->priv->pending_invocation, + worker->priv->child_pid); +@@ -3471,6 +3501,13 @@ gdm_session_worker_class_init (GdmSessionWorkerClass *klass) + "is reauth session", + FALSE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); ++ ++ g_object_class_install_property (object_class, ++ PROP_MAIN_LOOP, ++ g_param_spec_pointer ("main-loop", ++ "main loop", ++ "main loop", ++ G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + } + + static void +@@ -3561,13 +3598,15 @@ gdm_session_worker_finalize (GObject *object) + + GdmSessionWorker * + gdm_session_worker_new (const char *address, +- gboolean is_reauth_session) ++ gboolean is_reauth_session, ++ GMainLoop *main_loop) + { + GObject *object; + + object = g_object_new (GDM_TYPE_SESSION_WORKER, + "server-address", address, + "is-reauth-session", is_reauth_session, ++ "main-loop", main_loop, + NULL); + + return GDM_SESSION_WORKER (object); +diff --git a/daemon/gdm-session-worker.h b/daemon/gdm-session-worker.h +index 5603e80..24979e4 100644 +--- a/daemon/gdm-session-worker.h ++++ b/daemon/gdm-session-worker.h +@@ -51,6 +51,7 @@ typedef struct + GType gdm_session_worker_get_type (void); + + GdmSessionWorker * gdm_session_worker_new (const char *server_address, +- gboolean is_for_reauth) G_GNUC_MALLOC; ++ gboolean is_for_reauth, ++ GMainLoop *main_loop) G_GNUC_MALLOC; + G_END_DECLS + #endif /* GDM_SESSION_WORKER_H */ +diff --git a/daemon/session-worker-main.c b/daemon/session-worker-main.c +index 4a3a8eb..da3e7c6 100644 +--- a/daemon/session-worker-main.c ++++ b/daemon/session-worker-main.c +@@ -64,12 +64,6 @@ is_debug_set (void) + return debug; + } + +-static void +-on_sigterm_cb (int signal_number) +-{ +- _exit (EXIT_SUCCESS); +-} +- + int + main (int argc, + char **argv) +@@ -83,8 +77,6 @@ main (int argc, + { NULL } + }; + +- signal (SIGTERM, on_sigterm_cb); +- + bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); + textdomain (GETTEXT_PACKAGE); + setlocale (LC_ALL, ""); +@@ -120,10 +112,10 @@ main (int argc, + + is_for_reauth = g_getenv ("GDM_SESSION_FOR_REAUTH") != NULL; + +- worker = gdm_session_worker_new (address, is_for_reauth); +- + main_loop = g_main_loop_new (NULL, FALSE); + ++ worker = gdm_session_worker_new (address, is_for_reauth, main_loop); ++ + g_unix_signal_add (SIGUSR1, on_sigusr1_cb, NULL); + + g_main_loop_run (main_loop); diff --git a/gdm-plymouth-vt1.patch b/gdm-plymouth-vt1.patch deleted file mode 100644 index 82e8470..0000000 --- a/gdm-plymouth-vt1.patch +++ /dev/null @@ -1,65 +0,0 @@ -Index: gdm-3.29.90/daemon/main.c -=================================================================== ---- gdm-3.29.90.orig/daemon/main.c 2018-08-03 16:20:51.000000000 +0200 -+++ gdm-3.29.90/daemon/main.c 2018-08-04 00:35:56.183076931 +0200 -@@ -33,6 +33,8 @@ - #include - #include - #include -+#include -+#include - - #include - #include -@@ -302,6 +304,23 @@ block_sigusr1 (void) - sigprocmask (SIG_BLOCK, &mask, NULL); - } - -+static void -+jump_to_vt (int vt_number) -+{ -+ int fd; -+ -+ fd = open ("/dev/tty0", O_RDWR | O_NOCTTY); -+ if (ioctl (fd, VT_ACTIVATE, vt_number) < 0) { -+ g_debug ("Gdm: couldn't initiate jump to VT %d: %m", -+ vt_number); -+ } else if (ioctl (fd, VT_WAITACTIVE, vt_number) < 0) { -+ g_debug ("Gdm: couldn't finalize jump to VT %d: %m", -+ vt_number); -+ } -+ close(fd); -+} -+ -+ - int - main (int argc, - char **argv) -@@ -310,6 +329,7 @@ main (int argc, - GOptionContext *context; - GError *error = NULL; - gboolean res; -+ gboolean plymouth_running = FALSE; - static gboolean do_timed_exit = FALSE; - static gboolean print_version = FALSE; - static gboolean fatal_warnings = FALSE; -@@ -382,6 +402,8 @@ main (int argc, - - g_chdir ("/"); - -+ plymouth_running = g_access("/run/plymouth/pid", F_OK) == 0; -+ - main_loop = g_main_loop_new (NULL, FALSE); - - g_unix_signal_add (SIGTERM, on_shutdown_signal_cb, main_loop); -@@ -404,6 +426,10 @@ main (int argc, - - g_main_loop_unref (main_loop); - -+ if (plymouth_running) { -+ jump_to_vt (1); -+ } -+ - return EXIT_SUCCESS; - } - diff --git a/gdm-switch-to-tty1.patch b/gdm-switch-to-tty1.patch new file mode 100644 index 0000000..638b884 --- /dev/null +++ b/gdm-switch-to-tty1.patch @@ -0,0 +1,43 @@ +Index: gdm-3.30.2/daemon/main.c +=================================================================== +--- gdm-3.30.2.orig/daemon/main.c ++++ gdm-3.30.2/daemon/main.c +@@ -61,6 +61,29 @@ static GdmSettings *settings = + static uid_t gdm_uid = -1; + static gid_t gdm_gid = -1; + ++#define SHELLSCRIPT "\ ++/bin/bash -c \ ++\'PROCESS=\"X Xwayland\"\;\ ++R=$(pidof $PROCESS)\;\ ++while [ $? == 0 ]\;\ ++do sleep 1\;\ ++ R=$(pidof $PROCESS)\;\ ++done\;\ ++/usr/bin/chvt 1\'\ ++" ++ ++static void ++jump_to_tty1 () ++{ ++ g_autoptr(GError) error = NULL; ++ ++ g_spawn_command_line_async (SHELLSCRIPT, ++ &error); ++ ++ if (error != NULL) ++ g_warning ("Error chvt to tty1: %s", error->message); ++} ++ + static gboolean + timed_exit_cb (GMainLoop *loop) + { +@@ -402,6 +425,8 @@ main (int argc, + gdm_settings_direct_shutdown (); + gdm_log_shutdown (); + ++ jump_to_tty1 (); ++ + g_main_loop_unref (main_loop); + + return EXIT_SUCCESS; diff --git a/gdm.changes b/gdm.changes index 0c619ee..9fbb6fa 100644 --- a/gdm.changes +++ b/gdm.changes @@ -1,3 +1,13 @@ +------------------------------------------------------------------- +Wed Feb 20 07:10:14 UTC 2019 - xwang@suse.com + +- Add gdm-kill-user-session.patch: Kill all sessions when stopping + gdm service + (bsc#1112294 bsc#1120307 bsc#1113245 glgo#GNOME/gdm#400). +- Add gdm-switch-to-tty1.patch: Switch to tty1 when stopping gdm + service (bsc#1113700). +- Drop gdm-plymouth-vt1.patch: Replaced by gdm-switch-to-tty1.patch + ------------------------------------------------------------------- Tue Feb 12 10:49:15 UTC 2019 - Felix Zhang diff --git a/gdm.spec b/gdm.spec index e3a0936..5b52117 100644 --- a/gdm.spec +++ b/gdm.spec @@ -49,8 +49,8 @@ Patch2: gdm-suse-xsession.patch Patch3: gdm-default-wm.patch # PATCH-FIX-OPENSUSE gdm-xauthlocalhostname.patch bnc#538064 vuntz@novell.com -- Set XAUTHLOCALHOSTNAME to current hostname when we authenticate, for local logins, to avoid issues in the session in case the hostname changes later one. See comment 24 in the bug. Patch4: gdm-xauthlocalhostname.patch -# PATCH-FIX-UPSTREAM gdm-plymouth-vt1.patch bnc#881676 fcrozat@suse.com -- switch to VT1 when quitting if gdm was starting with plymouth running -Patch6: gdm-plymouth-vt1.patch +# PATCH-FIX-OPENSUSE gdm-switch-to-tty1.patch bsc#1113700 xwang@suse.com -- switch to tty1 when stopping gdm service +Patch6: gdm-switch-to-tty1.patch # PATCH-FIX-UPSTREAM gdm-fails-to-restart-gnome-shell.patch bsc#981976 bgo#769969 tyang@suse.com -- Gdm should stop after a few times fails Patch7: gdm-fails-to-restart-gnome-shell.patch # PATCH-NEEDS-REBASE gdm-add-runtime-option-to-disable-starting-X-server-as-u.patch bnc#1075805 bgo#793255 msrb@suse.com -- Add runtime option to start X under root instead of regular user. Necessary if no DRI drivers are present. WAS: PATCH-FIX-UPSTREAM, rejected upstream @@ -59,6 +59,8 @@ Patch8: gdm-add-runtime-option-to-disable-starting-X-server-as-u.patch Patch9: gdm-ignore-duplicate-desktop-file.patch # PATCH-FIX-UPSTREAM gdm-CVE-2019-3825.patch boo#1124628 glgo#GNOME/gdm#460 fezhang@suse.com -- Fix lock screen bypass when timed login is enabled Patch10: gdm-CVE-2019-3825.patch +# PATCH-FIX-UPSTREAM gdm-kill-user-session.patch bsc#1112294 glgo#GNOME/gdm#400 xwang@suse.com -- Kill all sessions when stopping gdm service +Patch11: gdm-kill-user-session.patch ### NOTE: Keep please SLE-only patches at bottom (starting on 1000). # PATCH-FIX-SLE gdm-disable-gnome-initial-setup.patch bnc#1067976 qzhao@suse.com -- Disable gnome-initial-setup runs before gdm, g-i-s will only serve for CJK people to choose the input-method after login. @@ -203,6 +205,7 @@ cp %{SOURCE8} . #patch8 -p1 %patch9 -p1 %patch10 -p1 +%patch11 -p1 # TODO: Hack still needed until https://gitlab.gnome.org/GNOME/gdm/issues/424 gets fixed and released. rm data/61-gdm.rules