# HG changeset patch # User Christian Brabandt # Date 1467054905 -7200 # Node ID 2465b6cda394f17c43ad5e5f26e204ae49f89fb0 # Parent 7626b6fba7fc148a57d04a7aed77fec12dc796a8 commit https://github.com/vim/vim/commit/adb78a77ebb47627bcf73bd16ac1119d970e17c8 Author: Bram Moolenaar Date: Mon Jun 27 21:10:31 2016 +0200 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 --- a/src/channel.c +++ b/src/channel.c @@ -1317,7 +1317,7 @@ write_buf_line(buf_T *buf, linenr_T lnum /* 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 @@ channel_get_all(channel_T *channel, int { 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 @@ channel_get_all(channel_T *channel, int /* 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 --- a/src/testdir/test_channel.vim +++ b/src/testdir/test_channel.vim @@ -1018,6 +1018,28 @@ func Test_pipe_null() 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 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1965, +/**/ 1964, /**/ 1963,