Patch 8.0.0166
Summary:    JSON with a duplicate key gives an internal error
Problem:    JSON with a duplicate key gives an internal error. (Lcd)
Solution:   Give a normal error.  Avoid an error when parsing JSON from a
            remote client fails.
Files:      src/evalfunc.c, src/json.c, src/channel.c,
            src/testdir/test_json.vim


*** ../vim-8.0.0165/src/evalfunc.c      2017-01-08 13:25:47.626339783 +0100
--- src/evalfunc.c      2017-01-10 14:19:11.339009907 +0100
***************
*** 6818,6825 ****
      reader.js_buf = get_tv_string(&argvars[0]);
      reader.js_fill = NULL;
      reader.js_used = 0;
!     if (json_decode_all(&reader, rettv, 0) != OK)
!       EMSG(_(e_invarg));
  }
  
  /*
--- 6818,6824 ----
      reader.js_buf = get_tv_string(&argvars[0]);
      reader.js_fill = NULL;
      reader.js_used = 0;
!     json_decode_all(&reader, rettv, 0);
  }
  
  /*
*** ../vim-8.0.0165/src/json.c  2016-11-10 20:01:41.193582919 +0100
--- src/json.c  2017-01-10 14:25:22.032328415 +0100
***************
*** 428,433 ****
--- 428,434 ----
        {
            if (*p == NUL)
                return MAYBE;
+           EMSG(_(e_invarg));
            return FAIL;
        }
      }
***************
*** 488,493 ****
--- 489,495 ----
                if (key == NULL || *key == NUL)
                {
                    clear_tv(&tvkey);
+                   EMSG(_(e_invarg));
                    return FAIL;
                }
            }
***************
*** 501,506 ****
--- 503,509 ----
                clear_tv(&tvkey);
            if (*p == NUL)
                return MAYBE;
+           EMSG(_(e_invarg));
            return FAIL;
        }
        ++reader->js_used;
***************
*** 514,519 ****
--- 517,530 ----
            return ret;
        }
  
+       if (res != NULL && dict_find(res->vval.v_dict, key, -1) != NULL)
+       {
+           EMSG2(_("E937: Duplicate key in JSON: \"%s\""), key);
+           clear_tv(&tvkey);
+           clear_tv(&item);
+           return FAIL;
+       }
+ 
        if (res != NULL)
        {
            di = dictitem_alloc(key);
***************
*** 540,545 ****
--- 551,557 ----
        {
            if (*p == NUL)
                return MAYBE;
+           EMSG(_(e_invarg));
            return FAIL;
        }
      }
***************
*** 715,721 ****
   * Decode one item and put it in "res".  If "res" is NULL only advance.
   * Must already have skipped white space.
   *
!  * Return FAIL for a decoding error.
   * Return MAYBE for an incomplete message.
   */
      static int
--- 727,733 ----
   * Decode one item and put it in "res".  If "res" is NULL only advance.
   * Must already have skipped white space.
   *
!  * Return FAIL for a decoding error (and give an error).
   * Return MAYBE for an incomplete message.
   */
      static int
***************
*** 739,745 ****
--- 751,760 ----
  
        case ',': /* comma: empty item */
            if ((options & JSON_JS) == 0)
+           {
+               EMSG(_(e_invarg));
                return FAIL;
+           }
            /* FALLTHROUGH */
        case NUL: /* empty */
            if (res != NULL)
***************
*** 761,767 ****
--- 776,785 ----
                    if (*sp == NUL)
                        return MAYBE;
                    if (!VIM_ISDIGIT(*sp))
+                   {
+                       EMSG(_(e_invarg));
                        return FAIL;
+                   }
                }
                sp = skipdigits(sp);
                if (*sp == '.' || *sp == 'e' || *sp == 'E')
***************
*** 866,871 ****
--- 884,890 ----
        res->v_type = VAR_SPECIAL;
        res->vval.v_number = VVAL_NONE;
      }
+     EMSG(_(e_invarg));
      return FAIL;
  }
  
***************
*** 884,893 ****
--- 903,919 ----
      json_skip_white(reader);
      ret = json_decode_item(reader, res, options);
      if (ret != OK)
+     {
+       if (ret == MAYBE)
+           EMSG(_(e_invarg));
        return FAIL;
+     }
      json_skip_white(reader);
      if (reader->js_buf[reader->js_used] != NUL)
+     {
+       EMSG(_(e_trailing));
        return FAIL;
+     }
      return OK;
  }
  
*** ../vim-8.0.0165/src/channel.c       2017-01-08 20:50:47.433486722 +0100
--- src/channel.c       2017-01-10 14:51:11.216941142 +0100
***************
*** 1896,1904 ****
  
      /* When a message is incomplete we wait for a short while for more to
       * arrive.  After the delay drop the input, otherwise a truncated string
!      * or list will make us hang.  */
      status = json_decode(&reader, &listtv,
                                  chanpart->ch_mode == MODE_JS ? JSON_JS : 0);
      if (status == OK)
      {
        /* Only accept the response when it is a list with at least two
--- 1896,1907 ----
  
      /* When a message is incomplete we wait for a short while for more to
       * arrive.  After the delay drop the input, otherwise a truncated string
!      * or list will make us hang.
!      * Do not generate error messages, they will be written in a channel log. 
*/
!     ++emsg_silent;
      status = json_decode(&reader, &listtv,
                                  chanpart->ch_mode == MODE_JS ? JSON_JS : 0);
+     --emsg_silent;
      if (status == OK)
      {
        /* Only accept the response when it is a list with at least two
*** ../vim-8.0.0165/src/testdir/test_json.vim   2016-07-21 20:10:29.000000000 
+0200
--- src/testdir/test_json.vim   2017-01-10 14:26:22.407891917 +0100
***************
*** 148,155 ****
  
    call assert_fails('call json_decode("\"")', "E474:")
    call assert_fails('call json_decode("blah")', "E474:")
!   call assert_fails('call json_decode("true blah")', "E474:")
    call assert_fails('call json_decode("<foobar>")', "E474:")
  
    call assert_fails('call json_decode("{")', "E474:")
    call assert_fails('call json_decode("{foobar}")', "E474:")
--- 148,156 ----
  
    call assert_fails('call json_decode("\"")', "E474:")
    call assert_fails('call json_decode("blah")', "E474:")
!   call assert_fails('call json_decode("true blah")', "E488:")
    call assert_fails('call json_decode("<foobar>")', "E474:")
+   call assert_fails('call json_decode("{\"a\":1,\"a\":2}")', "E937:")
  
    call assert_fails('call json_decode("{")', "E474:")
    call assert_fails('call json_decode("{foobar}")', "E474:")
*** ../vim-8.0.0165/src/version.c       2017-01-10 13:55:11.373452931 +0100
--- src/version.c       2017-01-10 15:13:45.582924948 +0100
***************
*** 766,767 ****
--- 766,769 ----
  {   /* Add new patch number below this line */
+ /**/
+     166,
  /**/

-- 
Marriage isn't a word.  It's a sentence.

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