diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2016-10-19 02:09:29 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-10-19 02:09:29 +0200 |
commit | 6a6f188d2ac457266c47732bf19ef8c60e79959b (patch) | |
tree | 9c0288adb64b6779b6e19dfc873f1ba0fe65b16f /src | |
parent | 657ba62a84de4ae0fd6dbaa2d3c238de4b372669 (diff) | |
parent | 9706664b8827614817a43f3a4ac4b6ae8463a906 (diff) | |
download | rneovim-6a6f188d2ac457266c47732bf19ef8c60e79959b.tar.gz rneovim-6a6f188d2ac457266c47732bf19ef8c60e79959b.tar.bz2 rneovim-6a6f188d2ac457266c47732bf19ef8c60e79959b.zip |
Merge #5502 from justinmk/error-write-to-bg-process
system('foo &', 'bar'): Show error, don't crash.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/event/rstream.c | 4 | ||||
-rw-r--r-- | src/nvim/os/shell.c | 10 |
2 files changed, 12 insertions, 2 deletions
diff --git a/src/nvim/event/rstream.c b/src/nvim/event/rstream.c index 5126dfd84e..92efc9fa2e 100644 --- a/src/nvim/event/rstream.c +++ b/src/nvim/event/rstream.c @@ -112,8 +112,8 @@ static void read_cb(uv_stream_t *uvstream, ssize_t cnt, const uv_buf_t *buf) // to `alloc_cb` will return the same unused pointer(`rbuffer_produced` // won't be called) && cnt != 0) { - DLOG("Closing Stream(%p) because of %s(%zd)", stream, - uv_strerror((int)cnt), cnt); + DLOG("Closing Stream (%p): %s (%s)", stream, + uv_err_name((int)cnt), os_strerror((int)cnt)); // Read error or EOF, either way stop the stream and invoke the callback // with eof == true uv_read_stop(uvstream); diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c index e9a3dcbff8..18ee008d66 100644 --- a/src/nvim/os/shell.c +++ b/src/nvim/os/shell.c @@ -545,6 +545,16 @@ static size_t write_output(char *output, size_t remaining, bool to_buffer, static void shell_write_cb(Stream *stream, void *data, int status) { + if (status) { + // Can happen if system() tries to send input to a shell command that was + // backgrounded (:call system("cat - &", "foo")). #3529 #5241 + EMSG2(_("E5677: Error writing input to shell-command: %s"), + uv_err_name(status)); + } + if (stream->closed) { // Process may have exited before this write. + ELOG("stream was already closed"); + return; + } stream_close(stream, NULL, NULL); } |