aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/os/shell.c5
-rw-r--r--test/old/testdir/test_shell.vim14
2 files changed, 16 insertions, 3 deletions
diff --git a/src/nvim/os/shell.c b/src/nvim/os/shell.c
index d60d0b3e55..e711611d67 100644
--- a/src/nvim/os/shell.c
+++ b/src/nvim/os/shell.c
@@ -1211,7 +1211,6 @@ static void read_input(StringBuilder *buf)
size_t lplen = (size_t)ml_get_len(lnum);
while (true) {
- lplen -= written;
if (lplen == 0) {
len = 0;
} else if (lp[written] == NL) {
@@ -1220,11 +1219,11 @@ static void read_input(StringBuilder *buf)
kv_push(*buf, NUL);
} else {
char *s = vim_strchr(lp + written, NL);
- len = s == NULL ? lplen : (size_t)(s - (lp + written));
+ len = s == NULL ? lplen - written : (size_t)(s - (lp + written));
kv_concat_len(*buf, lp + written, len);
}
- if (len == lplen) {
+ if (len == lplen - written) {
// Finished a line, add a NL, unless this line should not have one.
if (lnum != curbuf->b_op_end.lnum
|| (!curbuf->b_p_bin && curbuf->b_p_fixeol)
diff --git a/test/old/testdir/test_shell.vim b/test/old/testdir/test_shell.vim
index 9499462a70..e30e9c9ec8 100644
--- a/test/old/testdir/test_shell.vim
+++ b/test/old/testdir/test_shell.vim
@@ -281,4 +281,18 @@ func Test_shell_no_prevcmd()
call delete('Xtestdone')
endfunc
+func Test_shell_filter_buffer_with_nul_bytes()
+ CheckUnix
+ new
+ set noshelltemp
+ " \n is a NUL byte
+ let lines = ["aaa\nbbb\nccc\nddd\neee", "fff\nggg\nhhh\niii\njjj"]
+ call setline(1, lines)
+ %!cat
+ call assert_equal(lines, getline(1, '$'))
+
+ set shelltemp&
+ bwipe!
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab