SHA256
1
0
forked from pool/gdm

Accepting request 677606 from home:xiaoguang_wang:branches:GNOME:Factory

- 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

OBS-URL: https://build.opensuse.org/request/show/677606
OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/gdm?expand=0&rev=420
This commit is contained in:
Dominique Leuenberger 2019-02-21 11:33:29 +00:00 committed by Git OBS Bridge
parent 2f2c643041
commit 9ef4de6111
5 changed files with 322 additions and 67 deletions

264
gdm-kill-user-session.patch Normal file
View File

@ -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 <errno.h>
#include <grp.h>
#include <pwd.h>
+#include <signal.h>
#include <security/pam_appl.h>
@@ -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);

View File

@ -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 <sys/wait.h>
#include <locale.h>
#include <signal.h>
+#include <sys/ioctl.h>
+#include <sys/vt.h>
#include <glib.h>
#include <glib/gi18n.h>
@@ -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;
}

43
gdm-switch-to-tty1.patch Normal file
View File

@ -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;

View File

@ -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 <fezhang@suse.com>

View File

@ -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