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.2 / 7.2.347 < prev    next >
Encoding:
Internet Message Format  |  2010-01-26  |  3.7 KB

  1. To: vim-dev@vim.org
  2. Subject: Patch 7.2.347
  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.2.347
  11. Problem:    Crash when executing <expr> mapping redefines that same mapping.
  12. Solution:   Save the values used before evaluating the expression.
  13. Files:        src/getchar.c
  14.  
  15.  
  16. *** ../vim-7.2.346/src/getchar.c    2009-11-11 16:23:37.000000000 +0100
  17. --- src/getchar.c    2010-01-27 17:30:42.000000000 +0100
  18. ***************
  19. *** 2389,2394 ****
  20. --- 2389,2405 ----
  21.               /* complete match */
  22.               if (keylen >= 0 && keylen <= typebuf.tb_len)
  23.               {
  24. + #ifdef FEAT_EVAL
  25. +             int save_m_expr;
  26. +             int save_m_noremap;
  27. +             int save_m_silent;
  28. +             char_u *save_m_keys;
  29. +             char_u *save_m_str;
  30. + #else
  31. + # define save_m_noremap mp->m_noremap
  32. + # define save_m_silent mp->m_silent
  33. + #endif
  34.               /* write chars to script file(s) */
  35.               if (keylen > typebuf.tb_maplen)
  36.                   gotchars(typebuf.tb_buf + typebuf.tb_off
  37. ***************
  38. *** 2431,2436 ****
  39. --- 2442,2457 ----
  40.   #endif
  41.   
  42.   #ifdef FEAT_EVAL
  43. +             /* Copy the values from *mp that are used, because
  44. +              * evaluating the expression may invoke a function
  45. +              * that redefines the mapping, thereby making *mp
  46. +              * invalid. */
  47. +             save_m_expr = mp->m_expr;
  48. +             save_m_noremap = mp->m_noremap;
  49. +             save_m_silent = mp->m_silent;
  50. +             save_m_keys = NULL;  /* only saved when needed */
  51. +             save_m_str = NULL;  /* only saved when needed */
  52.               /*
  53.                * Handle ":map <expr>": evaluate the {rhs} as an
  54.                * expression.  Save and restore the typeahead so that
  55. ***************
  56. *** 2446,2452 ****
  57.                   if (tabuf.typebuf_valid)
  58.                   {
  59.                   vgetc_busy = 0;
  60. !                 s = eval_map_expr(mp->m_str, NUL);
  61.                   vgetc_busy = save_vgetc_busy;
  62.                   }
  63.                   else
  64. --- 2467,2475 ----
  65.                   if (tabuf.typebuf_valid)
  66.                   {
  67.                   vgetc_busy = 0;
  68. !                 save_m_keys = vim_strsave(mp->m_keys);
  69. !                 save_m_str = vim_strsave(mp->m_str);
  70. !                 s = eval_map_expr(save_m_str, NUL);
  71.                   vgetc_busy = save_vgetc_busy;
  72.                   }
  73.                   else
  74. ***************
  75. *** 2470,2486 ****
  76.               else
  77.               {
  78.                   i = ins_typebuf(s,
  79. !                     mp->m_noremap != REMAP_YES
  80. !                         ? mp->m_noremap
  81. !                         : STRNCMP(s, mp->m_keys,
  82.                                 (size_t)keylen) != 0
  83.                                ? REMAP_YES : REMAP_SKIP,
  84. !                 0, TRUE, cmd_silent || mp->m_silent);
  85.   #ifdef FEAT_EVAL
  86. !                 if (mp->m_expr)
  87.                   vim_free(s);
  88.   #endif
  89.               }
  90.               if (i == FAIL)
  91.               {
  92.                   c = -1;
  93. --- 2493,2517 ----
  94.               else
  95.               {
  96.                   i = ins_typebuf(s,
  97. !                     save_m_noremap != REMAP_YES
  98. !                         ? save_m_noremap
  99. !                         : STRNCMP(s,
  100. ! #ifdef FEAT_EVAL
  101. !                        save_m_keys != NULL ? save_m_keys :
  102. ! #endif
  103. !                               mp->m_keys,
  104.                                 (size_t)keylen) != 0
  105.                                ? REMAP_YES : REMAP_SKIP,
  106. !                 0, TRUE, cmd_silent || save_m_silent);
  107.   #ifdef FEAT_EVAL
  108. !                 if (save_m_expr)
  109.                   vim_free(s);
  110.   #endif
  111.               }
  112. + #ifdef FEAT_EVAL
  113. +             vim_free(save_m_keys);
  114. +             vim_free(save_m_str);
  115. + #endif
  116.               if (i == FAIL)
  117.               {
  118.                   c = -1;
  119. *** ../vim-7.2.346/src/version.c    2010-01-27 16:31:00.000000000 +0100
  120. --- src/version.c    2010-01-27 17:27:32.000000000 +0100
  121. ***************
  122. *** 683,684 ****
  123. --- 683,686 ----
  124.   {   /* Add new patch number below this line */
  125. + /**/
  126. +     347,
  127.   /**/
  128.  
  129. -- 
  130. hundred-and-one symptoms of being an internet addict:
  131. 156. You forget your friend's name but not her e-mail address.
  132.  
  133.  /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
  134. ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
  135. \\\        download, build and distribute -- http://www.A-A-P.org        ///
  136.  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
  137.