diff options
-rw-r--r-- | src/exec_monitor.c | 5 | ||||
-rw-r--r-- | src/exec_pty.c | 9 | ||||
-rw-r--r-- | src/sudo_exec.h | 1 |
3 files changed, 9 insertions, 6 deletions
diff --git a/src/exec_monitor.c b/src/exec_monitor.c index eacc0079e..f18b612c7 100644 --- a/src/exec_monitor.c +++ b/src/exec_monitor.c @@ -1,7 +1,7 @@ /* * 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 * 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(); 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. */ setpgid(0, self); diff --git a/src/exec_pty.c b/src/exec_pty.c index 22601201d..5a366062b 100644 --- a/src/exec_pty.c +++ b/src/exec_pty.c @@ -67,7 +67,7 @@ static void schedule_signal(struct exec_closure *ec, int signo); /* * Cleanup hook for sudo_fatal()/sudo_fatalx() */ -void +static void pty_cleanup(void) { 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)) 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. * 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]); if (io_pipe[STDERR_FILENO][0] != -1) 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 * since it might be part of a pipeline that reads from /dev/tty. diff --git a/src/sudo_exec.h b/src/sudo_exec.h index 57ada3de8..4b7b23f06 100644 --- a/src/sudo_exec.h +++ b/src/sudo_exec.h @@ -212,7 +212,6 @@ void exec_nopty(struct command_details *details, struct command_status *cstat); /* exec_pty.c */ bool exec_pty(struct command_details *details, struct command_status *cstat); -void pty_cleanup(void); int pty_make_controlling(void); extern int io_fds[6]; |