diff options
author | Fred Sundvik <fsundvik@gmail.com> | 2024-04-01 20:49:03 +0300 |
---|---|---|
committer | Fred Sundvik <fsundvik@gmail.com> | 2024-04-02 22:15:34 +0300 |
commit | b400b947f3683036ce74f404a0daec3455bb7637 (patch) | |
tree | 3ce61653fd720689ec6ad0ed02f912bd12b04a23 /src | |
parent | d9235efa76229708586d3c9db3dcbac46127ca0a (diff) | |
download | rneovim-b400b947f3683036ce74f404a0daec3455bb7637.tar.gz rneovim-b400b947f3683036ce74f404a0daec3455bb7637.tar.bz2 rneovim-b400b947f3683036ce74f404a0daec3455bb7637.zip |
fix: prevent child processes from inheriting ui channel file descriptors
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/channel.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/nvim/channel.c b/src/nvim/channel.c index 0222a134a7..b64edae2bf 100644 --- 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); } |