Merge pull request #28157 from fredizzimo/fsundvik/fix-io

fix: prevent child processes from inheriting ui channel file descriptors
This commit is contained in:
bfredl 2024-04-03 12:35:57 +02:00 committed by GitHub
commit ab0d3c4098
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 6 additions and 2 deletions

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);
}