Patch 8.1.0890
Problem:    Pty allocation wrong if using file for out channel and using null
            for in channel and null for error channel.
Solution:   Correct using use_file_for_out in condition. (Ozaki Kiichi, closes
            #3917)
Files:      src/os_unix.c, src/testdir/test_channel.vim


*** ../vim-8.1.0889/src/os_unix.c       2019-01-31 15:52:05.265907656 +0100
--- src/os_unix.c       2019-02-10 22:36:01.194231354 +0100
***************
*** 4196,4208 ****
  /*
   * Open a PTY, with FD for the master and slave side.
   * When failing "pty_master_fd" and "pty_slave_fd" are -1.
!  * When successful both file descriptors are stored.
   */
      static void
! open_pty(int *pty_master_fd, int *pty_slave_fd, char_u **namep)
  {
      char      *tty_name;
  
      *pty_master_fd = mch_openpty(&tty_name);      // open pty
      if (*pty_master_fd >= 0)
      {
--- 4196,4214 ----
  /*
   * Open a PTY, with FD for the master and slave side.
   * When failing "pty_master_fd" and "pty_slave_fd" are -1.
!  * When successful both file descriptors are stored and the allocated pty name
!  * is stored in both "*name1" and "*name2".
   */
      static void
! open_pty(int *pty_master_fd, int *pty_slave_fd, char_u **name1, char_u 
**name2)
  {
      char      *tty_name;
  
+     if (name1 != NULL)
+       *name1 = NULL;
+     if (name2 != NULL)
+       *name2 = NULL;
+ 
      *pty_master_fd = mch_openpty(&tty_name);      // open pty
      if (*pty_master_fd >= 0)
      {
***************
*** 4219,4226 ****
            close(*pty_master_fd);
            *pty_master_fd = -1;
        }
!       else if (namep != NULL)
!           *namep = vim_strsave((char_u *)tty_name);
      }
  }
  #endif
--- 4225,4237 ----
            close(*pty_master_fd);
            *pty_master_fd = -1;
        }
!       else
!       {
!           if (name1 != NULL)
!               *name1 = vim_strsave((char_u *)tty_name);
!           if (name2 != NULL)
!               *name2 = vim_strsave((char_u *)tty_name);
!       }
      }
  }
  #endif
***************
*** 4513,4519 ****
         * If the slave can't be opened, close the master pty.
         */
        if (p_guipty && !(options & (SHELL_READ|SHELL_WRITE)))
!           open_pty(&pty_master_fd, &pty_slave_fd, NULL);
        /*
         * If not opening a pty or it didn't work, try using pipes.
         */
--- 4524,4530 ----
         * If the slave can't be opened, close the master pty.
         */
        if (p_guipty && !(options & (SHELL_READ|SHELL_WRITE)))
!           open_pty(&pty_master_fd, &pty_slave_fd, NULL, NULL);
        /*
         * If not opening a pty or it didn't work, try using pipes.
         */
***************
*** 5352,5364 ****
  
      if (options->jo_pty
            && (!(use_file_for_in || use_null_for_in)
!               || !(use_file_for_in || use_null_for_out)
                || !(use_out_for_err || use_file_for_err || use_null_for_err)))
!     {
!       open_pty(&pty_master_fd, &pty_slave_fd, &job->jv_tty_out);
!       if (job->jv_tty_out != NULL)
!           job->jv_tty_in = vim_strsave(job->jv_tty_out);
!     }
  
      /* TODO: without the channel feature connect the child to /dev/null? */
      /* Open pipes for stdin, stdout, stderr. */
--- 5363,5372 ----
  
      if (options->jo_pty
            && (!(use_file_for_in || use_null_for_in)
!               || !(use_file_for_out || use_null_for_out)
                || !(use_out_for_err || use_file_for_err || use_null_for_err)))
!       open_pty(&pty_master_fd, &pty_slave_fd,
!                                           &job->jv_tty_out, &job->jv_tty_in);
  
      /* TODO: without the channel feature connect the child to /dev/null? */
      /* Open pipes for stdin, stdout, stderr. */
***************
*** 5834,5842 ****
      int               pty_slave_fd = -1;
      channel_T *channel;
  
!     open_pty(&pty_master_fd, &pty_slave_fd, &job->jv_tty_out);
!     if (job->jv_tty_out != NULL)
!       job->jv_tty_in = vim_strsave(job->jv_tty_out);
      close(pty_slave_fd);
  
      channel = add_channel();
--- 5842,5848 ----
      int               pty_slave_fd = -1;
      channel_T *channel;
  
!     open_pty(&pty_master_fd, &pty_slave_fd, &job->jv_tty_out, 
&job->jv_tty_in);
      close(pty_slave_fd);
  
      channel = add_channel();
*** ../vim-8.1.0889/src/testdir/test_channel.vim        2019-02-10 
22:23:23.020415140 +0100
--- src/testdir/test_channel.vim        2019-02-10 22:39:24.104680140 +0100
***************
*** 2040,2042 ****
--- 2040,2094 ----
    call assert_equal(-1, info.exitval)
    call assert_equal("term", info.termsig)
  endfunc
+ 
+ func Test_job_tty_in_out()
+   if !has('job') || !has('unix')
+     return
+   endif
+ 
+   call writefile(['test'], 'Xtestin')
+   let in_opts = [{},
+         \ {'in_io': 'null'},
+         \ {'in_io': 'file', 'in_name': 'Xtestin'}]
+   let out_opts = [{},
+         \ {'out_io': 'null'},
+         \ {'out_io': 'file', 'out_name': 'Xtestout'}]
+   let err_opts = [{},
+         \ {'err_io': 'null'},
+         \ {'err_io': 'file', 'err_name': 'Xtesterr'},
+         \ {'err_io': 'out'}]
+   let opts = []
+ 
+   for in_opt in in_opts
+     let x = copy(in_opt)
+     for out_opt in out_opts
+       call extend(x, out_opt)
+       for err_opt in err_opts
+         call extend(x, err_opt)
+         let opts += [extend({'pty': 1}, x)]
+       endfor
+     endfor
+   endfor
+ 
+   for opt in opts
+     let job = job_start('echo', opt)
+     let info = job_info(job)
+     let msg = printf('option={"in_io": "%s", "out_io": "%s", "err_io": "%s"}',
+           \ get(opt, 'in_io', 'tty'),
+           \ get(opt, 'out_io', 'tty'),
+           \ get(opt, 'err_io', 'tty'))
+ 
+     if !has_key(opt, 'in_io') || !has_key(opt, 'out_io') || !has_key(opt, 
'err_io')
+       call assert_notequal('', info.tty_in, msg)
+     else
+       call assert_equal('', info.tty_in, msg)
+     endif
+     call assert_equal(info.tty_in, info.tty_out, msg)
+ 
+     call WaitForAssert({-> assert_equal('dead', job_status(job))})
+   endfor
+ 
+   call delete('Xtestin')
+   call delete('Xtestout')
+   call delete('Xtesterr')
+ endfunc
*** ../vim-8.1.0889/src/version.c       2019-02-10 22:23:23.020415140 +0100
--- src/version.c       2019-02-10 22:42:46.495151907 +0100
***************
*** 785,786 ****
--- 785,788 ----
  {   /* Add new patch number below this line */
+ /**/
+     890,
  /**/

-- 
"I love deadlines.  I especially like the whooshing sound they
make as they go flying by."
                         -- Douglas Adams

 /// 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