]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 7.4.1616 v7.4.1616
authorBram Moolenaar <Bram@vim.org>
Sun, 20 Mar 2016 13:31:00 +0000 (14:31 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 20 Mar 2016 13:31:00 +0000 (14:31 +0100)
Problem:    Malformed channel request causes a hang.
Solution:   Drop malformed message. (Damien)

src/channel.c
src/testdir/test_channel.py
src/testdir/test_channel.vim
src/version.c

index 2a71077fd311a213e39d420812ebfdb3f51ad7d5..0d3f452d5b8b9cf1a9ff61fa842bef30d4e51b10 100644 (file)
@@ -1481,9 +1481,17 @@ channel_parse_json(channel_T *channel, int part)
      * 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;
+       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,12 +1594,14 @@ channel_exe_cmd(channel_T *channel, int part, typval_T *argv)
 
     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,6 +1611,7 @@ channel_exe_cmd(channel_T *channel, int part, typval_T *argv)
     {
        exarg_T ea;
 
+       ch_log(channel, "redraw");
        ea.forceit = *arg != NUL;
        ex_redraw(&ea);
        showruler(FALSE);
@@ -1642,11 +1653,18 @@ channel_exe_cmd(channel_T *channel, int part, typval_T *argv)
            /* 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 if (func_call(arg, &argv[2], NULL, NULL, &res_tv) == OK)
-               tv = &res_tv;
+           }
            else
-               tv = NULL;
+           {
+               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,10 +1866,7 @@ may_invoke_callback(channel_T *channel, int part)
 
        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;
index a465d65d2fad853fe1b146c4caa1a70a3c13ba80..47a12ea7e02a4432270fc2bbf8912c9450e34505 100644 (file)
@@ -104,6 +104,11 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
                         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\\"])"]'
index 6d38bffcec0e70e2455dc9a22a8443ec39b7ac70..c628bbe88124490d12b7cc67e869f3b41da76315 100644 (file)
@@ -123,10 +123,12 @@ func s:communicate(port)
     " 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.
index 2dbc1764c7d1155880ea77f59e713bb16727d1ae..c914ec479bf7a22fe1e5c79c9859623fa0f15ea2 100644 (file)
@@ -748,6 +748,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1616,
 /**/
     1615,
 /**/