chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
login: set_controller should fail if prepare_vt fails
[elogind.git]
/
src
/
login
/
logind-session.c
diff --git
a/src/login/logind-session.c
b/src/login/logind-session.c
index 4ca6b5d805aa436cf954fd29c7468e091e926eba..5a1cb81ccfd7c13f982816e705c843101d577a36 100644
(file)
--- a/
src/login/logind-session.c
+++ b/
src/login/logind-session.c
@@
-213,7
+213,6
@@
int session_save(Session *s) {
if (s->scope)
fprintf(f, "SCOPE=%s\n", s->scope);
if (s->scope)
fprintf(f, "SCOPE=%s\n", s->scope);
-
if (s->scope_job)
fprintf(f, "SCOPE_JOB=%s\n", s->scope_job);
if (s->scope_job)
fprintf(f, "SCOPE_JOB=%s\n", s->scope_job);
@@
-229,17
+228,54
@@
int session_save(Session *s) {
if (s->display)
fprintf(f, "DISPLAY=%s\n", s->display);
if (s->display)
fprintf(f, "DISPLAY=%s\n", s->display);
- if (s->remote_host)
- fprintf(f, "REMOTE_HOST=%s\n", s->remote_host);
+ if (s->remote_host) {
+ _cleanup_free_ char *escaped;
+
+ escaped = cescape(s->remote_host);
+ if (!escaped) {
+ r = -ENOMEM;
+ goto finish;
+ }
- if (s->remote_user)
- fprintf(f, "REMOTE_USER=%s\n", s->remote_user);
+ fprintf(f, "REMOTE_HOST=%s\n", escaped);
+ }
+
+ if (s->remote_user) {
+ _cleanup_free_ char *escaped;
+
+ escaped = cescape(s->remote_user);
+ if (!escaped) {
+ r = -ENOMEM;
+ goto finish;
+ }
- if (s->service)
- fprintf(f, "SERVICE=%s\n", s->service);
+ fprintf(f, "REMOTE_USER=%s\n", escaped);
+ }
+
+ if (s->service) {
+ _cleanup_free_ char *escaped;
+
+ escaped = cescape(s->service);
+ if (!escaped) {
+ r = -ENOMEM;
+ goto finish;
+ }
+
+ fprintf(f, "SERVICE=%s\n", escaped);
+ }
- if (s->desktop)
- fprintf(f, "DESKTOP=%s\n", s->desktop);
+ if (s->desktop) {
+ _cleanup_free_ char *escaped;
+
+
+ escaped = cescape(s->desktop);
+ if (!escaped) {
+ r = -ENOMEM;
+ goto finish;
+ }
+
+ fprintf(f, "DESKTOP=%s\n", escaped);
+ }
if (s->seat && seat_has_vts(s->seat))
fprintf(f, "VTNR=%u\n", s->vtnr);
if (s->seat && seat_has_vts(s->seat))
fprintf(f, "VTNR=%u\n", s->vtnr);
@@
-533,7
+569,7
@@
int session_start(Session *s) {
MESSAGE_ID(SD_MESSAGE_SESSION_START),
"SESSION_ID=%s", s->id,
"USER_ID=%s", s->user->name,
MESSAGE_ID(SD_MESSAGE_SESSION_START),
"SESSION_ID=%s", s->id,
"USER_ID=%s", s->user->name,
- "LEADER=
%lu", (unsigned long)
s->leader,
+ "LEADER=
"PID_FMT,
s->leader,
"MESSAGE=New session %s of user %s.", s->id, s->user->name,
NULL);
"MESSAGE=New session %s of user %s.", s->id, s->user->name,
NULL);
@@
-545,6
+581,8
@@
int session_start(Session *s) {
s->started = true;
s->started = true;
+ user_elect_display(s->user);
+
/* Save data */
session_save(s);
user_save(s->user);
/* Save data */
session_save(s);
user_save(s->user);
@@
-553,7
+591,7
@@
int session_start(Session *s) {
/* Send signals */
session_send_signal(s, true);
/* Send signals */
session_send_signal(s, true);
- user_send_changed(s->user, "Sessions", NULL);
+ user_send_changed(s->user, "Sessions",
"Display",
NULL);
if (s->seat) {
if (s->seat->active == s)
seat_send_changed(s->seat, "Sessions", "ActiveSession", NULL);
if (s->seat) {
if (s->seat->active == s)
seat_send_changed(s->seat, "Sessions", "ActiveSession", NULL);
@@
-612,6
+650,8
@@
int session_stop(Session *s, bool force) {
s->stopping = true;
s->stopping = true;
+ user_elect_display(s->user);
+
session_save(s);
user_save(s->user);
session_save(s);
user_save(s->user);
@@
-632,7
+672,7
@@
int session_finalize(Session *s) {
MESSAGE_ID(SD_MESSAGE_SESSION_STOP),
"SESSION_ID=%s", s->id,
"USER_ID=%s", s->user->name,
MESSAGE_ID(SD_MESSAGE_SESSION_STOP),
"SESSION_ID=%s", s->id,
"USER_ID=%s", s->user->name,
- "LEADER=
%lu", (unsigned long)
s->leader,
+ "LEADER=
"PID_FMT,
s->leader,
"MESSAGE=Removed session %s.", s->id,
NULL);
"MESSAGE=Removed session %s.", s->id,
NULL);
@@
-660,7
+700,7
@@
int session_finalize(Session *s) {
}
user_save(s->user);
}
user_save(s->user);
- user_send_changed(s->user, "Sessions", NULL);
+ user_send_changed(s->user, "Sessions",
"Display",
NULL);
return r;
}
return r;
}
@@
-938,8
+978,8
@@
int session_kill(Session *s, KillWho who, int signo) {
static int session_open_vt(Session *s) {
char path[sizeof("/dev/tty") + DECIMAL_STR_MAX(s->vtnr)];
static int session_open_vt(Session *s) {
char path[sizeof("/dev/tty") + DECIMAL_STR_MAX(s->vtnr)];
- if (
!s->vtnr
)
- return -
1
;
+ if (
s->vtnr < 1
)
+ return -
ENODEV
;
if (s->vtfd >= 0)
return s->vtfd;
if (s->vtfd >= 0)
return s->vtfd;
@@
-963,22
+1003,38
@@
static int session_vt_fn(sd_event_source *source, const struct signalfd_siginfo
return 0;
}
return 0;
}
-
void session_mut
e_vt(Session *s) {
+
int session_prepar
e_vt(Session *s) {
int vt, r;
struct vt_mode mode = { 0 };
sigset_t mask;
int vt, r;
struct vt_mode mode = { 0 };
sigset_t mask;
+ if (s->vtnr < 1)
+ return 0;
+
vt = session_open_vt(s);
if (vt < 0)
vt = session_open_vt(s);
if (vt < 0)
- return;
+ return vt;
+
+ r = fchown(vt, s->user->uid, -1);
+ if (r < 0) {
+ r = -errno;
+ log_error("Cannot change owner of /dev/tty%u: %m", s->vtnr);
+ goto error;
+ }
r = ioctl(vt, KDSKBMODE, K_OFF);
r = ioctl(vt, KDSKBMODE, K_OFF);
- if (r < 0)
+ if (r < 0) {
+ r = -errno;
+ log_error("Cannot set K_OFF on /dev/tty%u: %m", s->vtnr);
goto error;
goto error;
+ }
r = ioctl(vt, KDSETMODE, KD_GRAPHICS);
r = ioctl(vt, KDSETMODE, KD_GRAPHICS);
- if (r < 0)
+ if (r < 0) {
+ r = -errno;
+ log_error("Cannot set KD_GRAPHICS on /dev/tty%u: %m", s->vtnr);
goto error;
goto error;
+ }
sigemptyset(&mask);
sigaddset(&mask, SIGUSR1);
sigemptyset(&mask);
sigaddset(&mask, SIGUSR1);
@@
-995,14
+1051,17
@@
void session_mute_vt(Session *s) {
mode.relsig = SIGUSR1;
mode.acqsig = SIGUSR1;
r = ioctl(vt, VT_SETMODE, &mode);
mode.relsig = SIGUSR1;
mode.acqsig = SIGUSR1;
r = ioctl(vt, VT_SETMODE, &mode);
- if (r < 0)
+ if (r < 0) {
+ r = -errno;
+ log_error("Cannot set VT_PROCESS on /dev/tty%u: %m", s->vtnr);
goto error;
goto error;
+ }
- return;
+ return
0
;
error:
error:
- log_error("cannot mute VT %u for session %s (%d/%d)", s->vtnr, s->id, r, errno);
session_restore_vt(s);
session_restore_vt(s);
+ return r;
}
void session_restore_vt(Session *s) {
}
void session_restore_vt(Session *s) {
@@
-1026,6
+1085,8
@@
void session_restore_vt(Session *s) {
mode.mode = VT_AUTO;
ioctl(vt, VT_SETMODE, &mode);
mode.mode = VT_AUTO;
ioctl(vt, VT_SETMODE, &mode);
+ fchown(vt, 0, -1);
+
s->vtfd = safe_close(s->vtfd);
}
s->vtfd = safe_close(s->vtfd);
}
@@
-1079,8
+1140,6
@@
int session_set_controller(Session *s, const char *sender, bool force) {
return r;
}
return r;
}
- session_swap_controller(s, t);
-
/* When setting a session controller, we forcibly mute the VT and set
* it into graphics-mode. Applications can override that by changing
* VT state after calling TakeControl(). However, this serves as a good
/* When setting a session controller, we forcibly mute the VT and set
* it into graphics-mode. Applications can override that by changing
* VT state after calling TakeControl(). However, this serves as a good
@@
-1089,7
+1148,11
@@
int session_set_controller(Session *s, const char *sender, bool force) {
* exits.
* If logind crashes/restarts, we restore the controller during restart
* or reset the VT in case it crashed/exited, too. */
* exits.
* If logind crashes/restarts, we restore the controller during restart
* or reset the VT in case it crashed/exited, too. */
- session_mute_vt(s);
+ r = session_prepare_vt(s);
+ if (r < 0)
+ return r;
+
+ session_swap_controller(s, t);
return 0;
}
return 0;
}
@@
-1117,6
+1180,7
@@
static const char* const session_type_table[_SESSION_TYPE_MAX] = {
[SESSION_TTY] = "tty",
[SESSION_X11] = "x11",
[SESSION_WAYLAND] = "wayland",
[SESSION_TTY] = "tty",
[SESSION_X11] = "x11",
[SESSION_WAYLAND] = "wayland",
+ [SESSION_MIR] = "mir",
};
DEFINE_STRING_TABLE_LOOKUP(session_type, SessionType);
};
DEFINE_STRING_TABLE_LOOKUP(session_type, SessionType);