home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / patches / 7.3 / 7.3.155 < prev    next >
Encoding:
Internet Message Format  |  2012-11-20  |  8.3 KB

  1. To: vim_dev@googlegroups.com
  2. Subject: Patch 7.3.155
  3. Fcc: outbox
  4. From: Bram Moolenaar <Bram@moolenaar.net>
  5. Mime-Version: 1.0
  6. Content-Type: text/plain; charset=UTF-8
  7. Content-Transfer-Encoding: 8bit
  8. ------------
  9.  
  10. Patch 7.3.155
  11. Problem:    Crash when using map(), filter() and remove() on v:. (ZyX)
  12.             Also for extend(). (Yukihiro Nakadaira)
  13. Solution:   Mark v: as locked.  Also correct locking error messages.
  14. Files:        src/eval.c
  15.  
  16.  
  17. *** ../vim-7.3.154/src/eval.c    2011-04-01 16:07:41.000000000 +0200
  18. --- src/eval.c    2011-04-11 13:28:34.000000000 +0200
  19. ***************
  20. *** 853,858 ****
  21. --- 853,859 ----
  22.   
  23.       init_var_dict(&globvardict, &globvars_var);
  24.       init_var_dict(&vimvardict, &vimvars_var);
  25. +     vimvardict.dv_lock = VAR_FIXED;
  26.       hash_init(&compat_hashtab);
  27.       hash_init(&func_hashtab);
  28.   
  29. ***************
  30. *** 8545,8551 ****
  31.       if (argvars[0].v_type == VAR_LIST)
  32.       {
  33.       if ((l = argvars[0].vval.v_list) != NULL
  34. !         && !tv_check_lock(l->lv_lock, (char_u *)"add()")
  35.           && list_append_tv(l, &argvars[1]) == OK)
  36.           copy_tv(&argvars[0], rettv);
  37.       }
  38. --- 8546,8552 ----
  39.       if (argvars[0].v_type == VAR_LIST)
  40.       {
  41.       if ((l = argvars[0].vval.v_list) != NULL
  42. !         && !tv_check_lock(l->lv_lock, (char_u *)_("add() argument"))
  43.           && list_append_tv(l, &argvars[1]) == OK)
  44.           copy_tv(&argvars[0], rettv);
  45.       }
  46. ***************
  47. *** 9946,9951 ****
  48. --- 9947,9954 ----
  49.       typval_T    *argvars;
  50.       typval_T    *rettv;
  51.   {
  52. +     char      *arg_errmsg = N_("extend() argument");
  53.       if (argvars[0].v_type == VAR_LIST && argvars[1].v_type == VAR_LIST)
  54.       {
  55.       list_T        *l1, *l2;
  56. ***************
  57. *** 9955,9961 ****
  58.   
  59.       l1 = argvars[0].vval.v_list;
  60.       l2 = argvars[1].vval.v_list;
  61. !     if (l1 != NULL && !tv_check_lock(l1->lv_lock, (char_u *)"extend()")
  62.           && l2 != NULL)
  63.       {
  64.           if (argvars[2].v_type != VAR_UNKNOWN)
  65. --- 9958,9964 ----
  66.   
  67.       l1 = argvars[0].vval.v_list;
  68.       l2 = argvars[1].vval.v_list;
  69. !     if (l1 != NULL && !tv_check_lock(l1->lv_lock, (char_u *)_(arg_errmsg))
  70.           && l2 != NULL)
  71.       {
  72.           if (argvars[2].v_type != VAR_UNKNOWN)
  73. ***************
  74. *** 9994,10000 ****
  75.   
  76.       d1 = argvars[0].vval.v_dict;
  77.       d2 = argvars[1].vval.v_dict;
  78. !     if (d1 != NULL && !tv_check_lock(d1->dv_lock, (char_u *)"extend()")
  79.           && d2 != NULL)
  80.       {
  81.           /* Check the third argument. */
  82. --- 9997,10003 ----
  83.   
  84.       d1 = argvars[0].vval.v_dict;
  85.       d2 = argvars[1].vval.v_dict;
  86. !     if (d1 != NULL && !tv_check_lock(d1->dv_lock, (char_u *)_(arg_errmsg))
  87.           && d2 != NULL)
  88.       {
  89.           /* Check the third argument. */
  90. ***************
  91. *** 10236,10255 ****
  92.       typval_T    save_key;
  93.       int        rem;
  94.       int        todo;
  95. !     char_u    *ermsg = map ? (char_u *)"map()" : (char_u *)"filter()";
  96.       int        save_did_emsg;
  97.       int        idx = 0;
  98.   
  99.       if (argvars[0].v_type == VAR_LIST)
  100.       {
  101.       if ((l = argvars[0].vval.v_list) == NULL
  102. !         || (map && tv_check_lock(l->lv_lock, ermsg)))
  103.           return;
  104.       }
  105.       else if (argvars[0].v_type == VAR_DICT)
  106.       {
  107.       if ((d = argvars[0].vval.v_dict) == NULL
  108. !         || (map && tv_check_lock(d->dv_lock, ermsg)))
  109.           return;
  110.       }
  111.       else
  112. --- 10239,10260 ----
  113.       typval_T    save_key;
  114.       int        rem;
  115.       int        todo;
  116. !     char_u    *ermsg = (char_u *)(map ? "map()" : "filter()");
  117. !     char    *arg_errmsg = (map ? N_("map() argument")
  118. !                    : N_("filter() argument"));
  119.       int        save_did_emsg;
  120.       int        idx = 0;
  121.   
  122.       if (argvars[0].v_type == VAR_LIST)
  123.       {
  124.       if ((l = argvars[0].vval.v_list) == NULL
  125. !         || tv_check_lock(l->lv_lock, (char_u *)_(arg_errmsg)))
  126.           return;
  127.       }
  128.       else if (argvars[0].v_type == VAR_DICT)
  129.       {
  130.       if ((d = argvars[0].vval.v_dict) == NULL
  131. !         || tv_check_lock(d->dv_lock, (char_u *)_(arg_errmsg)))
  132.           return;
  133.       }
  134.       else
  135. ***************
  136. *** 10286,10292 ****
  137.           {
  138.               --todo;
  139.               di = HI2DI(hi);
  140. !             if (tv_check_lock(di->di_tv.v_lock, ermsg))
  141.               break;
  142.               vimvars[VV_KEY].vv_str = vim_strsave(di->di_key);
  143.               if (filter_map_one(&di->di_tv, expr, map, &rem) == FAIL
  144. --- 10291,10298 ----
  145.           {
  146.               --todo;
  147.               di = HI2DI(hi);
  148. !             if (tv_check_lock(di->di_tv.v_lock,
  149. !                              (char_u *)_(arg_errmsg)))
  150.               break;
  151.               vimvars[VV_KEY].vv_str = vim_strsave(di->di_key);
  152.               if (filter_map_one(&di->di_tv, expr, map, &rem) == FAIL
  153. ***************
  154. *** 10305,10311 ****
  155.   
  156.           for (li = l->lv_first; li != NULL; li = nli)
  157.           {
  158. !         if (tv_check_lock(li->li_tv.v_lock, ermsg))
  159.               break;
  160.           nli = li->li_next;
  161.           vimvars[VV_KEY].vv_nr = idx;
  162. --- 10311,10317 ----
  163.   
  164.           for (li = l->lv_first; li != NULL; li = nli)
  165.           {
  166. !         if (tv_check_lock(li->li_tv.v_lock, (char_u *)_(arg_errmsg)))
  167.               break;
  168.           nli = li->li_next;
  169.           vimvars[VV_KEY].vv_nr = idx;
  170. ***************
  171. *** 12910,12916 ****
  172.       if (argvars[0].v_type != VAR_LIST)
  173.       EMSG2(_(e_listarg), "insert()");
  174.       else if ((l = argvars[0].vval.v_list) != NULL
  175. !         && !tv_check_lock(l->lv_lock, (char_u *)"insert()"))
  176.       {
  177.       if (argvars[2].v_type != VAR_UNKNOWN)
  178.           before = get_tv_number_chk(&argvars[2], &error);
  179. --- 12916,12922 ----
  180.       if (argvars[0].v_type != VAR_LIST)
  181.       EMSG2(_(e_listarg), "insert()");
  182.       else if ((l = argvars[0].vval.v_list) != NULL
  183. !         && !tv_check_lock(l->lv_lock, (char_u *)_("insert() argument")))
  184.       {
  185.       if (argvars[2].v_type != VAR_UNKNOWN)
  186.           before = get_tv_number_chk(&argvars[2], &error);
  187. ***************
  188. *** 14775,14787 ****
  189.       char_u    *key;
  190.       dict_T    *d;
  191.       dictitem_T    *di;
  192.   
  193.       if (argvars[0].v_type == VAR_DICT)
  194.       {
  195.       if (argvars[2].v_type != VAR_UNKNOWN)
  196.           EMSG2(_(e_toomanyarg), "remove()");
  197.       else if ((d = argvars[0].vval.v_dict) != NULL
  198. !         && !tv_check_lock(d->dv_lock, (char_u *)"remove() argument"))
  199.       {
  200.           key = get_tv_string_chk(&argvars[1]);
  201.           if (key != NULL)
  202. --- 14781,14794 ----
  203.       char_u    *key;
  204.       dict_T    *d;
  205.       dictitem_T    *di;
  206. +     char    *arg_errmsg = N_("remove() argument");
  207.   
  208.       if (argvars[0].v_type == VAR_DICT)
  209.       {
  210.       if (argvars[2].v_type != VAR_UNKNOWN)
  211.           EMSG2(_(e_toomanyarg), "remove()");
  212.       else if ((d = argvars[0].vval.v_dict) != NULL
  213. !         && !tv_check_lock(d->dv_lock, (char_u *)_(arg_errmsg)))
  214.       {
  215.           key = get_tv_string_chk(&argvars[1]);
  216.           if (key != NULL)
  217. ***************
  218. *** 14801,14807 ****
  219.       else if (argvars[0].v_type != VAR_LIST)
  220.       EMSG2(_(e_listdictarg), "remove()");
  221.       else if ((l = argvars[0].vval.v_list) != NULL
  222. !         && !tv_check_lock(l->lv_lock, (char_u *)"remove() argument"))
  223.       {
  224.       int        error = FALSE;
  225.   
  226. --- 14808,14814 ----
  227.       else if (argvars[0].v_type != VAR_LIST)
  228.       EMSG2(_(e_listdictarg), "remove()");
  229.       else if ((l = argvars[0].vval.v_list) != NULL
  230. !         && !tv_check_lock(l->lv_lock, (char_u *)_(arg_errmsg)))
  231.       {
  232.       int        error = FALSE;
  233.   
  234. ***************
  235. *** 15135,15141 ****
  236.       if (argvars[0].v_type != VAR_LIST)
  237.       EMSG2(_(e_listarg), "reverse()");
  238.       else if ((l = argvars[0].vval.v_list) != NULL
  239. !         && !tv_check_lock(l->lv_lock, (char_u *)"reverse()"))
  240.       {
  241.       li = l->lv_last;
  242.       l->lv_first = l->lv_last = NULL;
  243. --- 15142,15148 ----
  244.       if (argvars[0].v_type != VAR_LIST)
  245.       EMSG2(_(e_listarg), "reverse()");
  246.       else if ((l = argvars[0].vval.v_list) != NULL
  247. !         && !tv_check_lock(l->lv_lock, (char_u *)_("reverse() argument")))
  248.       {
  249.       li = l->lv_last;
  250.       l->lv_first = l->lv_last = NULL;
  251. ***************
  252. *** 16432,16438 ****
  253.       else
  254.       {
  255.       l = argvars[0].vval.v_list;
  256. !     if (l == NULL || tv_check_lock(l->lv_lock, (char_u *)"sort()"))
  257.           return;
  258.       rettv->vval.v_list = l;
  259.       rettv->v_type = VAR_LIST;
  260. --- 16439,16446 ----
  261.       else
  262.       {
  263.       l = argvars[0].vval.v_list;
  264. !     if (l == NULL || tv_check_lock(l->lv_lock,
  265. !                          (char_u *)_("sort() argument")))
  266.           return;
  267.       rettv->vval.v_list = l;
  268.       rettv->v_type = VAR_LIST;
  269. *** ../vim-7.3.154/src/version.c    2011-04-02 15:12:45.000000000 +0200
  270. --- src/version.c    2011-04-11 13:13:38.000000000 +0200
  271. ***************
  272. *** 716,717 ****
  273. --- 716,719 ----
  274.   {   /* Add new patch number below this line */
  275. + /**/
  276. +     155,
  277.   /**/
  278.  
  279. -- 
  280. I used to be indecisive, now I'm not sure.
  281.  
  282.  /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
  283. ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
  284. \\\  an exciting new programming language -- http://www.Zimbu.org        ///
  285.  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
  286.