Patch 7.4.1616
Problem:    Malformed channel request causes a hang.
Solution:   Drop malformed message. (Damien)
Files:      src/channel.c, src/testdir/test_channel.vim,
            src/testdir/test_channel.py

*** ../vim-7.4.1615/src/channel.c       2016-03-19 13:49:39.460590857 +0100
--- src/channel.c       2016-03-20 14:30:14.782823216 +0100
***************
*** 1481,1489 ****
       * TODO: insert in front */
      if (reader.js_buf[reader.js_used] != NUL)
      {
!       channel_save(channel, part, reader.js_buf + reader.js_used,
!               (int)(reader.js_end - reader.js_buf) - reader.js_used);
!       ret = TRUE;
      }
      else
        ret = FALSE;
--- 1481,1497 ----
       * TODO: insert in front */
      if (reader.js_buf[reader.js_used] != NUL)
      {
!       if (ret == FAIL)
!       {
!           ch_error(channel, "Decoding failed - discarding input");
!           ret = FALSE;
!       }
!       else
!       {
!           channel_save(channel, part, reader.js_buf + reader.js_used,
!                   (int)(reader.js_end - reader.js_buf) - reader.js_used);
!           ret = TRUE;
!       }
      }
      else
        ret = FALSE;
***************
*** 1586,1597 ****
--- 1594,1607 ----
  
      if (STRCMP(cmd, "ex") == 0)
      {
+       ch_logs(channel, "Executing ex command '%s'", (char *)arg);
        do_cmdline_cmd(arg);
      }
      else if (STRCMP(cmd, "normal") == 0)
      {
        exarg_T ea;
  
+       ch_logs(channel, "Executing normal command '%s'", (char *)arg);
        ea.arg = arg;
        ea.addr_count = 0;
        ea.forceit = TRUE; /* no mapping */
***************
*** 1601,1606 ****
--- 1611,1617 ----
      {
        exarg_T ea;
  
+       ch_log(channel, "redraw");
        ea.forceit = *arg != NUL;
        ex_redraw(&ea);
        showruler(FALSE);
***************
*** 1642,1652 ****
            /* Don't pollute the display with errors. */
            ++emsg_skip;
            if (!is_call)
                tv = eval_expr(arg, NULL);
!           else if (func_call(arg, &argv[2], NULL, NULL, &res_tv) == OK)
!               tv = &res_tv;
            else
!               tv = NULL;
  
            if (argv[id_idx].v_type == VAR_NUMBER)
            {
--- 1653,1670 ----
            /* Don't pollute the display with errors. */
            ++emsg_skip;
            if (!is_call)
+           {
+               ch_logs(channel, "Evaluating expression '%s'", (char *)arg);
                tv = eval_expr(arg, NULL);
!           }
            else
!           {
!               ch_logs(channel, "Calling '%s'", (char *)arg);
!               if (func_call(arg, &argv[2], NULL, NULL, &res_tv) == OK)
!                   tv = &res_tv;
!               else
!                   tv = NULL;
!           }
  
            if (argv[id_idx].v_type == VAR_NUMBER)
            {
***************
*** 1848,1857 ****
  
        if (argv[0].v_type == VAR_STRING)
        {
-           char_u      *cmd = argv[0].vval.v_string;
- 
            /* ["cmd", arg] or ["cmd", arg, arg] or ["cmd", arg, arg, arg] */
-           ch_logs(channel, "Executing %s command", (char *)cmd);
            channel_exe_cmd(channel, part, argv);
            free_tv(listtv);
            return TRUE;
--- 1866,1872 ----
*** ../vim-7.4.1615/src/testdir/test_channel.vim        2016-03-14 
23:22:31.219768924 +0100
--- src/testdir/test_channel.vim        2016-03-20 14:24:33.210354928 +0100
***************
*** 123,132 ****
      " check that no job is handled correctly
      call assert_equal('no process', string(ch_getjob(handle)))
    endif
- 
    " Simple string request and reply.
    call assert_equal('got it', ch_evalexpr(handle, 'hello!'))
  
    " Request that triggers sending two ex commands.  These will usually be
    " handled before getting the response, but it's not guaranteed, thus wait a
    " tiny bit for the commands to get executed.
--- 123,134 ----
      " check that no job is handled correctly
      call assert_equal('no process', string(ch_getjob(handle)))
    endif
    " Simple string request and reply.
    call assert_equal('got it', ch_evalexpr(handle, 'hello!'))
  
+   " Malformed command should be ignored.
+   call assert_equal('ok', ch_evalexpr(handle, 'malformed'))
+ 
    " Request that triggers sending two ex commands.  These will usually be
    " handled before getting the response, but it's not guaranteed, thus wait a
    " tiny bit for the commands to get executed.
*** ../vim-7.4.1615/src/testdir/test_channel.py 2016-03-05 20:54:28.216563776 
+0100
--- src/testdir/test_channel.py 2016-03-20 13:51:59.442281444 +0100
***************
*** 104,109 ****
--- 104,114 ----
                          print("sending: {}".format(cmd))
                          self.request.sendall(cmd.encode('utf-8'))
                          response = "ok"
+                     elif decoded[1] == 'malformed':
+                         cmd = '["ex",":"]wrong!["ex","smi"]'
+                         print("sending: {}".format(cmd))
+                         self.request.sendall(cmd.encode('utf-8'))
+                         response = "ok"
                      elif decoded[1] == 'an expr':
                          # Send an expr request.
                          cmd = '["expr","setline(\\"$\\", 
[\\"one\\",\\"two\\",\\"three\\"])"]'
*** ../vim-7.4.1615/src/version.c       2016-03-19 23:07:19.052790870 +0100
--- src/version.c       2016-03-20 14:29:06.203533708 +0100
***************
*** 750,751 ****
--- 750,753 ----
  {   /* Add new patch number below this line */
+ /**/
+     1616,
  /**/



-- 
The sooner you fall behind, the more time you'll have to catch up.

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