else if (wpid == 0) // child
{
linenr_T lnum = curbuf->b_op_start.lnum;
- int written = 0;
+ size_t written = 0;
char_u *lp = ml_get(lnum);
size_t lplen = (size_t)ml_get_len(lnum);
close(fromshell_fd);
for (;;)
{
- lplen -= written;
if (lplen == 0)
len = 0;
else if (lp[written] == NL)
char_u *s = vim_strchr(lp + written, NL);
len = write(toshell_fd, (char *)lp + written,
- s == NULL ? lplen
+ s == NULL ? lplen - written
: (size_t)(s - (lp + written)));
}
- if (len == (int)lplen)
+ if (len == (int)(lplen - written))
{
// Finished a line, add a NL, unless this line
// should not have one.
written = 0;
}
else if (len > 0)
- written += len;
+ written += (size_t)len;
}
_exit(0);
}
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