summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0993
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0993')
-rw-r--r--data/vim/patches/8.1.0993271
1 files changed, 271 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0993 b/data/vim/patches/8.1.0993
new file mode 100644
index 000000000..a214f4c23
--- /dev/null
+++ b/data/vim/patches/8.1.0993
@@ -0,0 +1,271 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0993
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0993
+Problem: ch_read() may return garbage if terminating NL is missing.
+Solution: Add terminating NUL. (Ozaki Kiichi, closes #4065)
+Files: src/channel.c, src/testdir/test_channel.vim
+
+
+*** ../vim-8.1.0992/src/channel.c 2019-02-20 22:45:01.723613804 +0100
+--- src/channel.c 2019-03-04 12:04:42.771564943 +0100
+***************
+*** 1797,1802 ****
+--- 1797,1803 ----
+
+ mch_memmove(buf, buf + len, node->rq_buflen - len);
+ node->rq_buflen -= len;
++ node->rq_buffer[node->rq_buflen] = NUL;
+ }
+
+ /*
+***************
+*** 1819,1825 ****
+ return FAIL;
+
+ last_node = node->rq_next;
+! len = node->rq_buflen + last_node->rq_buflen + 1;
+ if (want_nl)
+ while (last_node->rq_next != NULL
+ && channel_first_nl(last_node) == NULL)
+--- 1820,1826 ----
+ return FAIL;
+
+ last_node = node->rq_next;
+! len = node->rq_buflen + last_node->rq_buflen;
+ if (want_nl)
+ while (last_node->rq_next != NULL
+ && channel_first_nl(last_node) == NULL)
+***************
+*** 1828,1834 ****
+ len += last_node->rq_buflen;
+ }
+
+! p = newbuf = alloc(len);
+ if (newbuf == NULL)
+ return FAIL; /* out of memory */
+ mch_memmove(p, node->rq_buffer, node->rq_buflen);
+--- 1829,1835 ----
+ len += last_node->rq_buflen;
+ }
+
+! p = newbuf = alloc(len + 1);
+ if (newbuf == NULL)
+ return FAIL; /* out of memory */
+ mch_memmove(p, node->rq_buffer, node->rq_buflen);
+***************
+*** 1842,1847 ****
+--- 1843,1849 ----
+ p += n->rq_buflen;
+ vim_free(n->rq_buffer);
+ }
++ *p = NUL;
+ node->rq_buflen = (long_u)(p - newbuf);
+
+ /* dispose of the collapsed nodes and their buffers */
+***************
+*** 2666,2695 ****
+ }
+ buf = node->rq_buffer;
+
+! if (nl == NULL)
+! {
+! /* Flush remaining message that is missing a NL. */
+! char_u *new_buf;
+!
+! new_buf = vim_realloc(buf, node->rq_buflen + 1);
+! if (new_buf == NULL)
+! /* This might fail over and over again, should the message
+! * be dropped? */
+! return FALSE;
+! buf = new_buf;
+! node->rq_buffer = buf;
+! nl = buf + node->rq_buflen++;
+! *nl = NUL;
+! }
+!
+! /* Convert NUL to NL, the internal representation. */
+! for (p = buf; p < nl && p < buf + node->rq_buflen; ++p)
+ if (*p == NUL)
+ *p = NL;
+
+! if (nl + 1 == buf + node->rq_buflen)
+ {
+! /* get the whole buffer, drop the NL */
+ msg = channel_get(channel, part, NULL);
+ *nl = NUL;
+ }
+--- 2668,2687 ----
+ }
+ buf = node->rq_buffer;
+
+! // Convert NUL to NL, the internal representation.
+! for (p = buf; (nl == NULL || p < nl)
+! && p < buf + node->rq_buflen; ++p)
+ if (*p == NUL)
+ *p = NL;
+
+! if (nl == NULL)
+! {
+! // get the whole buffer, drop the NL
+! msg = channel_get(channel, part, NULL);
+! }
+! else if (nl + 1 == buf + node->rq_buflen)
+ {
+! // get the whole buffer
+ msg = channel_get(channel, part, NULL);
+ *nl = NUL;
+ }
+*** ../vim-8.1.0992/src/testdir/test_channel.vim 2019-02-11 22:00:07.671917613 +0100
+--- src/testdir/test_channel.vim 2019-03-04 12:01:07.813113919 +0100
+***************
+*** 203,210 ****
+ let start = reltime()
+ call assert_equal(v:none, ch_read(handle, {'timeout': 333}))
+ let elapsed = reltime(start)
+! call assert_true(reltimefloat(elapsed) > 0.3)
+! call assert_true(reltimefloat(elapsed) < 0.6)
+
+ " Send without waiting for a response, then wait for a response.
+ call ch_sendexpr(handle, 'wait a bit')
+--- 203,209 ----
+ let start = reltime()
+ call assert_equal(v:none, ch_read(handle, {'timeout': 333}))
+ let elapsed = reltime(start)
+! call assert_inrange(0.3, 0.6, reltimefloat(reltime(start)))
+
+ " Send without waiting for a response, then wait for a response.
+ call ch_sendexpr(handle, 'wait a bit')
+***************
+*** 434,442 ****
+ else
+ " Failed connection should wait about 500 msec. Can be longer if the
+ " computer is busy with other things.
+! let elapsed = reltime(start)
+! call assert_true(reltimefloat(elapsed) > 0.3)
+! call assert_true(reltimefloat(elapsed) < 1.5)
+ endif
+ catch
+ if v:exception !~ 'Connection reset by peer'
+--- 433,439 ----
+ else
+ " Failed connection should wait about 500 msec. Can be longer if the
+ " computer is busy with other things.
+! call assert_inrange(0.3, 1.5, reltimefloat(reltime(start)))
+ endif
+ catch
+ if v:exception !~ 'Connection reset by peer'
+***************
+*** 1590,1597 ****
+ else
+ let elapsed = 1.0
+ endif
+! call assert_true(elapsed > 0.5)
+! call assert_true(elapsed < 1.0)
+ endfunc
+
+ """""""""
+--- 1587,1593 ----
+ else
+ let elapsed = 1.0
+ endif
+! call assert_inrange(0.5, 1.0, elapsed)
+ endfunc
+
+ """""""""
+***************
+*** 1764,1773 ****
+ bwipe!
+ endfunc
+
+- func MyLineCountCb(ch, msg)
+- let g:linecount += 1
+- endfunc
+-
+ func Test_read_nonl_line()
+ if !has('job')
+ return
+--- 1760,1765 ----
+***************
+*** 1775,1782 ****
+
+ let g:linecount = 0
+ let arg = 'import sys;sys.stdout.write("1\n2\n3")'
+! call job_start([s:python, '-c', arg], {'callback': 'MyLineCountCb'})
+ call WaitForAssert({-> assert_equal(3, g:linecount)})
+ endfunc
+
+ func Test_read_from_terminated_job()
+--- 1767,1794 ----
+
+ let g:linecount = 0
+ let arg = 'import sys;sys.stdout.write("1\n2\n3")'
+! call job_start([s:python, '-c', arg], {'callback': {-> execute('let g:linecount += 1')}})
+ call WaitForAssert({-> assert_equal(3, g:linecount)})
++ unlet g:linecount
++ endfunc
++
++ func Test_read_nonl_in_close_cb()
++ if !has('job')
++ return
++ endif
++
++ func s:close_cb(ch)
++ while ch_status(a:ch) == 'buffered'
++ let g:out .= ch_read(a:ch)
++ endwhile
++ endfunc
++
++ let g:out = ''
++ let arg = 'import sys;sys.stdout.write("1\n2\n3")'
++ call job_start([s:python, '-c', arg], {'close_cb': function('s:close_cb')})
++ call WaitForAssert({-> assert_equal('123', g:out)})
++ unlet g:out
++ delfunc s:close_cb
+ endfunc
+
+ func Test_read_from_terminated_job()
+***************
+*** 1786,1793 ****
+
+ let g:linecount = 0
+ let arg = 'import os,sys;os.close(1);sys.stderr.write("test\n")'
+! call job_start([s:python, '-c', arg], {'callback': 'MyLineCountCb'})
+ call WaitForAssert({-> assert_equal(1, g:linecount)})
+ endfunc
+
+ func Test_job_start_windows()
+--- 1798,1806 ----
+
+ let g:linecount = 0
+ let arg = 'import os,sys;os.close(1);sys.stderr.write("test\n")'
+! call job_start([s:python, '-c', arg], {'callback': {-> execute('let g:linecount += 1')}})
+ call WaitForAssert({-> assert_equal(1, g:linecount)})
++ unlet g:linecount
+ endfunc
+
+ func Test_job_start_windows()
+*** ../vim-8.1.0992/src/version.c 2019-03-04 11:40:06.274241644 +0100
+--- src/version.c 2019-03-04 12:07:44.178258107 +0100
+***************
+*** 781,782 ****
+--- 781,784 ----
+ { /* Add new patch number below this line */
++ /**/
++ 993,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+35. Your husband tells you he's had that beard for 2 months.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///