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:
parent
2f2c643041
commit
9ef4de6111
264
gdm-kill-user-session.patch
Normal file
264
gdm-kill-user-session.patch
Normal 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);
|
@ -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
43
gdm-switch-to-tty1.patch
Normal 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;
|
10
gdm.changes
10
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 <fezhang@suse.com>
|
||||
|
||||
|
7
gdm.spec
7
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user