Register pty cleanup function in exec_pty(), not exec_cmnd_pty().

We want it to execute in the main sudo process, not the monitor.
This commit is contained in:
Todd C. Miller
2023-03-24 11:01:58 -06:00
parent 11739e3def
commit b81c5e8dac
3 changed files with 9 additions and 6 deletions

View File

@@ -1,7 +1,7 @@
/* /*
* SPDX-License-Identifier: ISC * SPDX-License-Identifier: ISC
* *
* Copyright (c) 2009-2022 Todd C. Miller <Todd.Miller@sudo.ws> * Copyright (c) 2009-2023 Todd C. Miller <Todd.Miller@sudo.ws>
* *
* Permission to use, copy, modify, and distribute this software for any * Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above * purpose with or without fee is hereby granted, provided that the above
@@ -354,9 +354,6 @@ exec_cmnd_pty(struct command_details *details, sigset_t *mask,
volatile pid_t self = getpid(); volatile pid_t self = getpid();
debug_decl(exec_cmnd_pty, SUDO_DEBUG_EXEC); debug_decl(exec_cmnd_pty, SUDO_DEBUG_EXEC);
/* Register cleanup function */
sudo_fatal_callback_register(pty_cleanup);
/* Set command process group here too to avoid a race. */ /* Set command process group here too to avoid a race. */
setpgid(0, self); setpgid(0, self);

View File

@@ -67,7 +67,7 @@ static void schedule_signal(struct exec_closure *ec, int signo);
/* /*
* Cleanup hook for sudo_fatal()/sudo_fatalx() * Cleanup hook for sudo_fatal()/sudo_fatalx()
*/ */
void static void
pty_cleanup(void) pty_cleanup(void)
{ {
debug_decl(cleanup, SUDO_DEBUG_EXEC); debug_decl(cleanup, SUDO_DEBUG_EXEC);
@@ -1075,6 +1075,9 @@ exec_pty(struct command_details *details, struct command_status *cstat)
if (!pty_setup(details, user_details.tty)) if (!pty_setup(details, user_details.tty))
debug_return_bool(false); debug_return_bool(false);
/* Register cleanup function */
sudo_fatal_callback_register(pty_cleanup);
/* /*
* We communicate with the monitor over a bi-directional pair of sockets. * We communicate with the monitor over a bi-directional pair of sockets.
* Parent sends signal info to monitor and monitor sends back wait status. * Parent sends signal info to monitor and monitor sends back wait status.
@@ -1284,6 +1287,10 @@ exec_pty(struct command_details *details, struct command_status *cstat)
close(io_pipe[STDOUT_FILENO][0]); close(io_pipe[STDOUT_FILENO][0]);
if (io_pipe[STDERR_FILENO][0] != -1) if (io_pipe[STDERR_FILENO][0] != -1)
close(io_pipe[STDERR_FILENO][0]); close(io_pipe[STDERR_FILENO][0]);
/* Only run the cleanup hook in the parent. */
sudo_fatal_callback_deregister(pty_cleanup);
/* /*
* If stdin/stdout is not a tty, start command in the background * If stdin/stdout is not a tty, start command in the background
* since it might be part of a pipeline that reads from /dev/tty. * since it might be part of a pipeline that reads from /dev/tty.

View File

@@ -212,7 +212,6 @@ void exec_nopty(struct command_details *details, struct command_status *cstat);
/* exec_pty.c */ /* exec_pty.c */
bool exec_pty(struct command_details *details, struct command_status *cstat); bool exec_pty(struct command_details *details, struct command_status *cstat);
void pty_cleanup(void);
int pty_make_controlling(void); int pty_make_controlling(void);
extern int io_fds[6]; extern int io_fds[6];