patch 7.4.1965
Problem: When using a job in raw mode to append to a buffer garbage
characters are added.
Solution: Do not replace the trailing NUL with a NL. (Ozaki Kiichi)
diff --git a/src/channel.c b/src/channel.c
index 50028c8..1c93b6c 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -1317,7 +1317,7 @@
/* Need to make a copy to be able to append a NL. */
if ((p = alloc(len + 2)) == NULL)
return;
- STRCPY(p, line);
+ memcpy((char *)p, (char *)line, len);
p[len] = NL;
p[len + 1] = NUL;
channel_send(channel, PART_IN, p, "write_buf_line()");
@@ -1616,7 +1616,7 @@
{
readq_T *head = &channel->ch_part[part].ch_head;
readq_T *node = head->rq_next;
- long_u len = 1;
+ long_u len = 0;
char_u *res;
char_u *p;
@@ -1627,7 +1627,7 @@
/* Concatenate everything into one buffer. */
for (node = head->rq_next; node != NULL; node = node->rq_next)
len += node->rq_buflen;
- res = lalloc(len, TRUE);
+ res = lalloc(len + 1, TRUE);
if (res == NULL)
return NULL;
p = res;
diff --git a/src/testdir/test_channel.vim b/src/testdir/test_channel.vim
index 9d68a14..8679a16 100644
--- a/src/testdir/test_channel.vim
+++ b/src/testdir/test_channel.vim
@@ -1018,6 +1018,28 @@
call job_stop(job)
endfunc
+func Test_pipe_to_buffer_raw()
+ if !has('job')
+ return
+ endif
+ call ch_log('Test_raw_pipe_to_buffer()')
+ let options = {'out_mode': 'raw', 'out_io': 'buffer', 'out_name': 'testout'}
+ split testout
+ let job = job_start([s:python, '-c',
+ \ 'import sys; [sys.stdout.write(".") and sys.stdout.flush() for _ in range(10000)]'], options)
+ call assert_equal("run", job_status(job))
+ call s:waitFor('len(join(getline(2,line("$")),"") >= 10000')
+ try
+ for line in getline(2, '$')
+ let line = substitute(line, '^\.*', '', '')
+ call assert_equal('', line)
+ endfor
+ finally
+ call job_stop(job)
+ bwipe!
+ endtry
+endfunc
+
func Test_reuse_channel()
if !has('job')
return
diff --git a/src/version.c b/src/version.c
index 087c2d8..8501997 100644
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1965,
+/**/
1964,
/**/
1963,