neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit ab0d3c4098b6c3fba4de3d9eb46c8b0692db902f
parent e74cd1d9ffa935914905c6fc666c5bbf0cba36b7
Author: bfredl <bjorn.linse@gmail.com>
Date:   Wed,  3 Apr 2024 12:35:57 +0200

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

fix: prevent child processes from inheriting ui channel file descriptors
Diffstat:
Msrc/nvim/channel.c | 8++++++--
1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/nvim/channel.c b/src/nvim/channel.c @@ -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); }