diff options
| author | Matthew Malcomson <hardenedapple@gmail.com> | 2017-01-21 14:11:30 +0000 | 
|---|---|---|
| committer | Justin M. Keyes <justinkz@gmail.com> | 2017-03-17 12:20:51 +0100 | 
| commit | f6946c68aee90c6ae8337b3e42c72943e37a507e (patch) | |
| tree | 477386daf3393c1a71fec15eac3d75ec46d283d0 /src/nvim/os/pty_process_unix.c | |
| parent | ad1884be0dcf029f7467e5cfad8ffe7c8ba461b6 (diff) | |
| download | rneovim-f6946c68aee90c6ae8337b3e42c72943e37a507e.tar.gz rneovim-f6946c68aee90c6ae8337b3e42c72943e37a507e.tar.bz2 rneovim-f6946c68aee90c6ae8337b3e42c72943e37a507e.zip | |
job-control: set CLOEXEC on pty processes. #5986
Before this change, new processes started with libuv prevented SIGHUP
from reaching pty processes (by keeping the ptmx file descriptor open).
Diffstat (limited to 'src/nvim/os/pty_process_unix.c')
| -rw-r--r-- | src/nvim/os/pty_process_unix.c | 21 | 
1 files changed, 19 insertions, 2 deletions
| diff --git a/src/nvim/os/pty_process_unix.c b/src/nvim/os/pty_process_unix.c index f5ba0c2612..71a5e13de5 100644 --- a/src/nvim/os/pty_process_unix.c +++ b/src/nvim/os/pty_process_unix.c @@ -73,6 +73,13 @@ int pty_process_spawn(PtyProcess *ptyproc)      goto error;    } +  // Other jobs and providers should not get a copy of this file descriptor. +  if (os_set_cloexec(master) == -1) { +    status = -errno; +    ELOG("Failed to set CLOEXEC on ptmx file descriptor"); +    goto error; +  } +    if (proc->in        && (status = set_duplicating_descriptor(master, &proc->in->uv.pipe))) {      goto error; @@ -215,14 +222,24 @@ static int set_duplicating_descriptor(int fd, uv_pipe_t *pipe)      ELOG("Failed to dup descriptor %d: %s", fd, strerror(errno));      return status;    } + +  if (os_set_cloexec(fd_dup) == -1) { +    status = -errno; +    ELOG("Failed to set CLOEXEC on duplicate fd"); +    goto error; +  } +    status = uv_pipe_open(pipe, fd_dup);    if (status) {      ELOG("Failed to set pipe to descriptor %d: %s",           fd_dup, uv_strerror(status)); -    close(fd_dup); -    return status; +    goto error;    }    return status; + +error: +  close(fd_dup); +  return status;  }  static void chld_handler(uv_signal_t *handle, int signum) | 
