fix: prevent child processes from inheriting ui channel file descriptors

This commit is contained in:
Fred Sundvik 2024-04-01 20:49:03 +03:00
parent d9235efa76
commit b400b947f3

View File

@ -544,8 +544,12 @@ uint64_t channel_from_stdio(bool rpc, CallbackReader on_output, const char **err
}
#else
if (embedded_mode) {
stdin_dup_fd = dup(STDIN_FILENO);
stdout_dup_fd = dup(STDOUT_FILENO);
// In embedded mode redirect stdout and stdin to stderr, since they are used for the UI channel.
// NOTE: fnctl with F_DUPFD_CLOEXEC is used instead of dup to prevent child processes from
// inheriting the file descriptors, which make it impossible for UIs to detect when nvim exits
// while one or more of its child processes are still running.
stdin_dup_fd = fcntl(STDIN_FILENO, F_DUPFD_CLOEXEC, STDERR_FILENO + 1);
stdout_dup_fd = fcntl(STDOUT_FILENO, F_DUPFD_CLOEXEC, STDERR_FILENO + 1);
dup2(STDERR_FILENO, STDOUT_FILENO);
dup2(STDERR_FILENO, STDIN_FILENO);
}