summaryrefslogtreecommitdiff
path: root/src/login
diff options
context:
space:
mode:
authorFranck Bui <fbui@suse.com>2017-04-26 14:20:41 +0200
committerFranck Bui <fbui@suse.com>2017-06-08 16:21:36 +0200
commitdc6284e9efb0a6801dd7a951d39ebb7d9a279676 (patch)
tree9a0889495859a3f3433083872a54fddcd7495162 /src/login
parent4c47affcf1e501431f3cb567c516ec252dfc4bbc (diff)
downloadsystemd-dc6284e9efb0a6801dd7a951d39ebb7d9a279676.tar.gz
logind: when setting a new controller, don't prepare the VT if logind is restarted
When assigning a new session controller to a session, the VT is prepared so the controller can expect the VT to be in a good default state. However when logind is restarted and a session controller already took control of a session, there's no need to prepare th VT otherwise logind may screw up the VT state set by the controller. This patch prevents the preparation of the VT in this case.
Diffstat (limited to 'src/login')
-rw-r--r--src/login/logind-session-dbus.c2
-rw-r--r--src/login/logind-session.c17
-rw-r--r--src/login/logind-session.h2
3 files changed, 12 insertions, 9 deletions
diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c
index 22dea5db1f..412efcd958 100644
--- a/src/login/logind-session-dbus.c
+++ b/src/login/logind-session-dbus.c
@@ -396,7 +396,7 @@ static int method_take_control(sd_bus_message *message, void *userdata, sd_bus_e
if (uid != 0 && (force || uid != s->user->uid))
return sd_bus_error_setf(error, SD_BUS_ERROR_ACCESS_DENIED, "Only owner of session may take control");
- r = session_set_controller(s, sd_bus_message_get_sender(message), force);
+ r = session_set_controller(s, sd_bus_message_get_sender(message), force, true);
if (r < 0)
return r;
diff --git a/src/login/logind-session.c b/src/login/logind-session.c
index 4a168906d6..ae05877a68 100644
--- a/src/login/logind-session.c
+++ b/src/login/logind-session.c
@@ -449,7 +449,7 @@ int session_load(Session *s) {
if (controller) {
if (bus_name_has_owner(s->manager->bus, controller, NULL) > 0)
- session_set_controller(s, controller, false);
+ session_set_controller(s, controller, false, false);
else
session_restore_vt(s);
}
@@ -1170,7 +1170,7 @@ static int on_bus_track(sd_bus_track *track, void *userdata) {
return 0;
}
-int session_set_controller(Session *s, const char *sender, bool force) {
+int session_set_controller(Session *s, const char *sender, bool force, bool prepare) {
_cleanup_free_ char *name = NULL;
int r;
@@ -1202,11 +1202,14 @@ int session_set_controller(Session *s, const char *sender, bool force) {
* Note that we reset the VT on ReleaseControl() and if the controller
* exits.
* If logind crashes/restarts, we restore the controller during restart
- * or reset the VT in case it crashed/exited, too. */
- r = session_prepare_vt(s);
- if (r < 0) {
- s->track = sd_bus_track_unref(s->track);
- return r;
+ * (without preparing the VT since the controller has probably overridden
+ * VT state by now) or reset the VT in case it crashed/exited, too. */
+ if (prepare) {
+ r = session_prepare_vt(s);
+ if (r < 0) {
+ s->track = sd_bus_track_unref(s->track);
+ return r;
+ }
}
session_release_controller(s, true);
diff --git a/src/login/logind-session.h b/src/login/logind-session.h
index ffb7cd2d41..c8a3152acb 100644
--- a/src/login/logind-session.h
+++ b/src/login/logind-session.h
@@ -176,7 +176,7 @@ void session_restore_vt(Session *s);
void session_leave_vt(Session *s);
bool session_is_controller(Session *s, const char *sender);
-int session_set_controller(Session *s, const char *sender, bool force);
+int session_set_controller(Session *s, const char *sender, bool force, bool prepare);
void session_drop_controller(Session *s);
int bus_session_method_activate(sd_bus_message *message, void *userdata, sd_bus_error *error);