To: vim_dev@googlegroups.com Subject: Patch 7.4.1465 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.1465 Problem: Coverity reported possible use of NULL pointer when using buffer output with JSON mode. Solution: Make it actually possible to use JSON mode with a buffer. Re-encode the JSON to append it to the buffer. Files: src/channel.c, src/testdir/test_channel.vim *** ../vim-7.4.1464/src/channel.c 2016-02-28 22:33:43.028904937 +0100 --- src/channel.c 2016-02-29 22:46:15.531699091 +0100 *************** *** 926,933 **** if ((opt->jo_set & JO_OUT_IO) && opt->jo_io[PART_OUT] == JIO_BUFFER) { ! /* writing output to a buffer. Force mode to NL. */ ! channel->ch_part[PART_OUT].ch_mode = MODE_NL; channel->ch_part[PART_OUT].ch_buffer = find_buffer(opt->jo_io_name[PART_OUT]); ch_logs(channel, "writing to buffer '%s'", --- 926,934 ---- if ((opt->jo_set & JO_OUT_IO) && opt->jo_io[PART_OUT] == JIO_BUFFER) { ! /* writing output to a buffer. Default mode is NL. */ ! if (!(opt->jo_set & JO_OUT_MODE)) ! channel->ch_part[PART_OUT].ch_mode = MODE_NL; channel->ch_part[PART_OUT].ch_buffer = find_buffer(opt->jo_io_name[PART_OUT]); ch_logs(channel, "writing to buffer '%s'", *************** *** 1560,1591 **** u_sync(TRUE); u_save(lnum, lnum + 1); ! ml_append(lnum, msg, 0, FALSE); ! appended_lines_mark(lnum, 1L); ! curbuf = save_curbuf; ! ! if (buffer->b_nwindows > 0) { ! win_T *wp; ! win_T *save_curwin; ! FOR_ALL_WINDOWS(wp) { ! if (wp->w_buffer == buffer ! && wp->w_cursor.lnum == lnum ! && wp->w_cursor.col == 0) { ! ++wp->w_cursor.lnum; ! save_curwin = curwin; ! curwin = wp; ! curbuf = curwin->w_buffer; ! scroll_cursor_bot(0, FALSE); ! curwin = save_curwin; ! curbuf = curwin->w_buffer; } } - redraw_buf_later(buffer, VALID); - channel_need_redraw = TRUE; } } if (callback != NULL) --- 1561,1598 ---- u_sync(TRUE); u_save(lnum, lnum + 1); ! if (msg == NULL) ! /* JSON or JS mode: re-encode the message. */ ! msg = json_encode(listtv, ch_mode); ! if (msg != NULL) { ! ml_append(lnum, msg, 0, FALSE); ! appended_lines_mark(lnum, 1L); ! curbuf = save_curbuf; ! if (buffer->b_nwindows > 0) { ! win_T *wp; ! win_T *save_curwin; ! ! FOR_ALL_WINDOWS(wp) { ! if (wp->w_buffer == buffer ! && wp->w_cursor.lnum == lnum ! && wp->w_cursor.col == 0) ! { ! ++wp->w_cursor.lnum; ! save_curwin = curwin; ! curwin = wp; ! curbuf = curwin->w_buffer; ! scroll_cursor_bot(0, FALSE); ! curwin = save_curwin; ! curbuf = curwin->w_buffer; ! } } + redraw_buf_later(buffer, VALID); + channel_need_redraw = TRUE; } } } if (callback != NULL) *** ../vim-7.4.1464/src/testdir/test_channel.vim 2016-02-28 19:50:47.555824204 +0100 --- src/testdir/test_channel.vim 2016-02-29 22:51:50.816154878 +0100 *************** *** 426,431 **** --- 426,457 ---- endtry endfunc + func Test_pipe_to_buffer_json() + if !has('job') + return + endif + call ch_log('Test_pipe_to_buffer_json()') + let job = job_start(s:python . " test_channel_pipe.py", + \ {'out-io': 'buffer', 'out-mode': 'json'}) + call assert_equal("run", job_status(job)) + try + let handle = job_getchannel(job) + call ch_sendraw(handle, "echo [0, \"hello\"]\n") + call ch_sendraw(handle, "echo [-2, 12.34]\n") + exe ch_getbufnr(handle, "out") . 'sbuf' + for i in range(100) + sleep 10m + if line('$') >= 3 + break + endif + endfor + call assert_equal(['Reading from channel output...', '[0,"hello"]', '[-2,12.34]'], getline(1, '$')) + bwipe! + finally + call job_stop(job) + endtry + endfunc + """""""""" let s:unletResponse = '' *** ../vim-7.4.1464/src/version.c 2016-02-29 22:05:16.841676901 +0100 --- src/version.c 2016-02-29 22:47:35.726851366 +0100 *************** *** 745,746 **** --- 745,748 ---- { /* Add new patch number below this line */ + /**/ + 1465, /**/ -- ARTHUR: The swallow may fly south with the sun, or the house martin or the plover seek warmer hot lands in winter, yet these are not strangers to our land. SOLDIER: Are you suggesting coconuts migrate? "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// 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 ///