Merge pull request #12057 from poettering/chown-tty
chown TTY back to root:tty after a service terminates that used them
This commit is contained in:
+36
-10
@@ -4157,17 +4157,23 @@ static bool tty_may_match_dev_console(const char *tty) {
|
||||
return true; /* if we could not resolve, assume it may */
|
||||
|
||||
/* "tty0" means the active VC, so it may be the same sometimes */
|
||||
return streq(resolved, tty) || (streq(resolved, "tty0") && tty_is_vc(tty));
|
||||
return path_equal(resolved, tty) || (streq(resolved, "tty0") && tty_is_vc(tty));
|
||||
}
|
||||
|
||||
bool exec_context_may_touch_console(const ExecContext *ec) {
|
||||
static bool exec_context_may_touch_tty(const ExecContext *ec) {
|
||||
assert(ec);
|
||||
|
||||
return (ec->tty_reset ||
|
||||
return ec->tty_reset ||
|
||||
ec->tty_vhangup ||
|
||||
ec->tty_vt_disallocate ||
|
||||
is_terminal_input(ec->std_input) ||
|
||||
is_terminal_output(ec->std_output) ||
|
||||
is_terminal_output(ec->std_error)) &&
|
||||
is_terminal_output(ec->std_error);
|
||||
}
|
||||
|
||||
bool exec_context_may_touch_console(const ExecContext *ec) {
|
||||
|
||||
return exec_context_may_touch_tty(ec) &&
|
||||
tty_may_match_dev_console(exec_context_tty_path(ec));
|
||||
}
|
||||
|
||||
@@ -4634,6 +4640,30 @@ void exec_context_free_log_extra_fields(ExecContext *c) {
|
||||
c->n_log_extra_fields = 0;
|
||||
}
|
||||
|
||||
void exec_context_revert_tty(ExecContext *c) {
|
||||
int r;
|
||||
|
||||
assert(c);
|
||||
|
||||
/* First, reset the TTY (possibly kicking everybody else from the TTY) */
|
||||
exec_context_tty_reset(c, NULL);
|
||||
|
||||
/* And then undo what chown_terminal() did earlier. Note that we only do this if we have a path
|
||||
* configured. If the TTY was passed to us as file descriptor we assume the TTY is opened and managed
|
||||
* by whoever passed it to us and thus knows better when and how to chmod()/chown() it back. */
|
||||
|
||||
if (exec_context_may_touch_tty(c)) {
|
||||
const char *path;
|
||||
|
||||
path = exec_context_tty_path(c);
|
||||
if (path) {
|
||||
r = chmod_and_chown(path, TTY_MODE, 0, TTY_GID);
|
||||
if (r < 0 && r != -ENOENT)
|
||||
log_warning_errno(r, "Failed to reset TTY ownership/access mode of %s, ignoring: %m", path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void exec_status_start(ExecStatus *s, pid_t pid) {
|
||||
assert(s);
|
||||
|
||||
@@ -4658,12 +4688,8 @@ void exec_status_exit(ExecStatus *s, const ExecContext *context, pid_t pid, int
|
||||
s->code = code;
|
||||
s->status = status;
|
||||
|
||||
if (context) {
|
||||
if (context->utmp_id)
|
||||
(void) utmp_put_dead_process(context->utmp_id, pid, code, status);
|
||||
|
||||
exec_context_tty_reset(context, NULL);
|
||||
}
|
||||
if (context && context->utmp_id)
|
||||
(void) utmp_put_dead_process(context->utmp_id, pid, code, status);
|
||||
}
|
||||
|
||||
void exec_status_reset(ExecStatus *s) {
|
||||
|
||||
@@ -374,6 +374,8 @@ int exec_context_get_effective_ioprio(const ExecContext *c);
|
||||
|
||||
void exec_context_free_log_extra_fields(ExecContext *c);
|
||||
|
||||
void exec_context_revert_tty(ExecContext *c);
|
||||
|
||||
void exec_status_start(ExecStatus *s, pid_t pid);
|
||||
void exec_status_exit(ExecStatus *s, const ExecContext *context, pid_t pid, int code, int status);
|
||||
void exec_status_dump(const ExecStatus *s, FILE *f, const char *prefix);
|
||||
|
||||
@@ -1754,6 +1754,9 @@ static void service_enter_dead(Service *s, ServiceResult f, bool allow_restart)
|
||||
if (s->pid_file)
|
||||
(void) unlink(s->pid_file);
|
||||
|
||||
/* Reset TTY ownership if necessary */
|
||||
exec_context_revert_tty(&s->exec_context);
|
||||
|
||||
return;
|
||||
|
||||
fail:
|
||||
|
||||
Reference in New Issue
Block a user