Patch 8.0.0715
Problem:    Writing to the wrong buffer if the buffer that a channel writes to
            was closed.
Solution:   Do not write to a buffer that was unloaded.
Files:      src/channel.c, src/testdir/test_channel.vim,
            src/testdir/test_channel_write.py


*** ../vim-8.0.0714/src/channel.c       2017-04-30 19:39:32.642857885 +0200
--- src/channel.c       2017-07-15 16:56:16.393253261 +0200
***************
*** 1438,1443 ****
--- 1438,1444 ----
      if (!bufref_valid(&in_part->ch_bufref) || buf->b_ml.ml_mfp == NULL)
      {
        /* buffer was wiped out or unloaded */
+       ch_log(channel, "input buffer has been wiped out");
        in_part->ch_bufref.br_buf = NULL;
        return;
      }
***************
*** 2338,2344 ****
      int               save_write_to = buffer->b_write_to_channel;
      chanpart_T  *ch_part = &channel->ch_part[part];
      int               save_p_ma = buffer->b_p_ma;
!     int               empty = (buffer->b_ml.ml_flags & ML_EMPTY);
  
      if (!buffer->b_p_ma && !ch_part->ch_nomodifiable)
      {
--- 2339,2345 ----
      int               save_write_to = buffer->b_write_to_channel;
      chanpart_T  *ch_part = &channel->ch_part[part];
      int               save_p_ma = buffer->b_p_ma;
!     int               empty = (buffer->b_ml.ml_flags & ML_EMPTY) ? 1 : 0;
  
      if (!buffer->b_p_ma && !ch_part->ch_nomodifiable)
      {
***************
*** 2359,2371 ****
      }
  
      /* Append to the buffer */
!     ch_logn(channel, "appending line %d to buffer", (int)lnum + 1);
  
      buffer->b_p_ma = TRUE;
      curbuf = buffer;
      u_sync(TRUE);
      /* ignore undo failure, undo is not very useful here */
!     ignored = u_save(lnum, lnum + 1 + (empty ? 1 : 0));
  
      if (empty)
      {
--- 2360,2373 ----
      }
  
      /* Append to the buffer */
!     ch_logn(channel, "appending line %d to buffer", (int)lnum + 1 - empty);
  
      buffer->b_p_ma = TRUE;
      curbuf = buffer;
+     curwin->w_buffer = curbuf;
      u_sync(TRUE);
      /* ignore undo failure, undo is not very useful here */
!     ignored = u_save(lnum - empty, lnum + 1);
  
      if (empty)
      {
***************
*** 2377,2382 ****
--- 2379,2385 ----
        ml_append(lnum, msg, 0, FALSE);
      appended_lines_mark(lnum, 1L);
      curbuf = save_curbuf;
+     curwin->w_buffer = curbuf;
      if (ch_part->ch_nomodifiable)
        buffer->b_p_ma = FALSE;
      else
***************
*** 2483,2491 ****
      }
  
      buffer = ch_part->ch_bufref.br_buf;
!     if (buffer != NULL && !bufref_valid(&ch_part->ch_bufref))
      {
!       /* buffer was wiped out */
        ch_part->ch_bufref.br_buf = NULL;
        buffer = NULL;
      }
--- 2486,2496 ----
      }
  
      buffer = ch_part->ch_bufref.br_buf;
!     if (buffer != NULL && (!bufref_valid(&ch_part->ch_bufref)
!                                              || buffer->b_ml.ml_mfp == NULL))
      {
!       /* buffer was wiped out or unloaded */
!       ch_logs(channel, "%s buffer has been wiped out", part_names[part]);
        ch_part->ch_bufref.br_buf = NULL;
        buffer = NULL;
      }
*** ../vim-8.0.0714/src/testdir/test_channel.vim        2017-03-18 
20:18:42.063950224 +0100
--- src/testdir/test_channel.vim        2017-07-15 16:53:53.326335870 +0200
***************
*** 739,744 ****
--- 739,776 ----
    call Run_test_pipe_to_buffer(1, 0, 1)
  endfunc
  
+ func Test_close_output_buffer()
+   if !has('job')
+     return
+   endif
+   enew!
+   let test_lines = ['one', 'two']
+   call setline(1, test_lines)
+   call ch_log('Test_close_output_buffer()')
+   let options = {'out_io': 'buffer'}
+   let options['out_name'] = 'buffer-output'
+   let options['out_msg'] = 0
+   split buffer-output
+   let job = job_start(s:python . " test_channel_write.py", options)
+   call assert_equal("run", job_status(job))
+   try
+     call WaitFor('line("$") == 3')
+     call assert_equal(3, line('$'))
+     quit!
+     sleep 100m
+     " Make sure the write didn't happen to the wrong buffer.
+     call assert_equal(test_lines, getline(1, line('$')))
+     call assert_equal(-1, bufwinnr('buffer-output'))
+     sbuf buffer-output
+     call assert_notequal(-1, bufwinnr('buffer-output'))
+     sleep 100m
+     close  " no more writes
+     bwipe!
+   finally
+     call job_stop(job)
+   endtry
+ endfunc
+ 
  func Run_test_pipe_err_to_buffer(use_name, nomod, do_msg)
    if !has('job')
      return
*** ../vim-8.0.0714/src/testdir/test_channel_write.py   2017-07-15 
17:01:01.203098057 +0200
--- src/testdir/test_channel_write.py   2017-07-15 16:21:21.357095968 +0200
***************
*** 0 ****
--- 1,18 ----
+ #!/usr/bin/python
+ #
+ # Program that writes a number to stdout repeatedly
+ #
+ # This requires Python 2.6 or later.
+ 
+ from __future__ import print_function
+ import sys
+ import time
+ 
+ if __name__ == "__main__":
+ 
+     done = 0
+     while done < 10:
+         done = done + 1
+         print(done)
+         sys.stdout.flush()
+         time.sleep(0.05)  # sleep 50 msec
*** ../vim-8.0.0714/src/version.c       2017-07-15 15:21:33.176248349 +0200
--- src/version.c       2017-07-15 16:01:19.910218741 +0200
***************
*** 766,767 ****
--- 766,769 ----
  {   /* Add new patch number below this line */
+ /**/
+     715,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
160. You get in the elevator and double-click the button for the floor
     you want.

 /// Bram Moolenaar -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui