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:
@@ -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);
|
||||
|
||||
|
@@ -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.
|
||||
|
@@ -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];
|
||||
|
||||
|
Reference in New Issue
Block a user