Patch 8.2.0098
Problem:    Exe stack length can be wrong without being detected.
Solution:   Add a check when ABORT_ON_INTERNAL_ERROR is defined.
Files:      src/macros.h, src/autocmd.c, src/buffer.c, src/ex_docmd.c,
            src/main.c, src/map.c, src/scriptfile.c, src/spellfile.c,
            src/userfunc.c


*** ../vim-8.2.0097/src/macros.h        2019-11-30 22:40:44.000000000 +0100
--- src/macros.h        2020-01-07 20:40:36.529317529 +0100
***************
*** 344,346 ****
--- 344,358 ----
  #else
  # define ERROR_IF_POPUP_WINDOW 0
  #endif
+ 
+ 
+ #ifdef ABORT_ON_INTERNAL_ERROR
+ # define ESTACK_CHECK_DECLARATION int estack_len_before;
+ # define ESTACK_CHECK_SETUP estack_len_before = exestack.ga_len;
+ # define ESTACK_CHECK_NOW if (estack_len_before != exestack.ga_len) \
+       siemsg("Exestack length expected: %d, actual: %d", estack_len_before, 
exestack.ga_len);
+ #else
+ # define ESTACK_CHECK_DECLARATION
+ # define ESTACK_CHECK_SETUP
+ # define ESTACK_CHECK_NOW
+ #endif
*** ../vim-8.2.0097/src/autocmd.c       2019-12-29 23:04:20.286639911 +0100
--- src/autocmd.c       2020-01-07 20:27:29.308509646 +0100
***************
*** 1827,1832 ****
--- 1827,1833 ----
      int               did_save_redobuff = FALSE;
      save_redo_T       save_redo;
      int               save_KeyTyped = KeyTyped;
+     ESTACK_CHECK_DECLARATION
  
      /*
       * Quickly return if there are no autocommands for this event or
***************
*** 2021,2026 ****
--- 2022,2028 ----
  
      // name and lnum are filled in later
      estack_push(ETYPE_AUCMD, NULL, 0);
+     ESTACK_CHECK_SETUP
  
  #ifdef FEAT_EVAL
      save_current_sctx = current_sctx;
***************
*** 2124,2129 ****
--- 2126,2132 ----
      filechangeshell_busy = FALSE;
      autocmd_nested = save_autocmd_nested;
      vim_free(SOURCING_NAME);
+     ESTACK_CHECK_NOW
      estack_pop();
      vim_free(autocmd_fname);
      autocmd_fname = save_autocmd_fname;
*** ../vim-8.2.0097/src/buffer.c        2020-01-03 20:59:55.847158293 +0100
--- src/buffer.c        2020-01-07 20:36:13.558342863 +0100
***************
*** 5287,5292 ****
--- 5287,5293 ----
  #ifdef FEAT_EVAL
      sctx_T    save_current_sctx;
  #endif
+     ESTACK_CHECK_DECLARATION
  
      prev = -1;
      for (s = ml_get(lnum); *s != NUL; ++s)
***************
*** 5330,5335 ****
--- 5331,5337 ----
  
        // prepare for emsg()
        estack_push(ETYPE_MODELINE, (char_u *)"modelines", lnum);
+       ESTACK_CHECK_SETUP
  
        end = FALSE;
        while (end == FALSE)
***************
*** 5390,5395 ****
--- 5392,5398 ----
            s = e + 1;                  // advance to next part
        }
  
+       ESTACK_CHECK_NOW
        estack_pop();
        vim_free(linecopy);
      }
*** ../vim-8.2.0097/src/ex_docmd.c      2020-01-06 21:47:17.040023214 +0100
--- src/ex_docmd.c      2020-01-07 20:36:23.574303312 +0100
***************
*** 645,650 ****
--- 645,651 ----
  # define cmd_cookie cookie
  #endif
      static int        call_depth = 0;         // recursiveness
+     ESTACK_CHECK_DECLARATION
  
  #ifdef FEAT_EVAL
      // For every pair of do_cmdline()/do_one_cmd() calls, use an extra memory
***************
*** 1260,1265 ****
--- 1261,1267 ----
  
            estack_push(ETYPE_EXCEPT, current_exception->throw_name,
                                                current_exception->throw_lnum);
+           ESTACK_CHECK_SETUP
            current_exception->throw_name = NULL;
  
            discard_current_exception();        // uses IObuff if 'verbose'
***************
*** 1284,1289 ****
--- 1286,1292 ----
                vim_free(p);
            }
            vim_free(SOURCING_NAME);
+           ESTACK_CHECK_NOW
            estack_pop();
        }
  
*** ../vim-8.2.0097/src/main.c  2019-12-29 23:04:20.290639897 +0100
--- src/main.c  2020-01-07 20:55:05.826031934 +0100
***************
*** 3086,3101 ****
--- 3086,3104 ----
      char_u    **cmds = parmp->pre_commands;
      int               cnt = parmp->n_pre_commands;
      int               i;
+     ESTACK_CHECK_DECLARATION
  
      if (cnt > 0)
      {
        curwin->w_cursor.lnum = 0; // just in case..
        estack_push(ETYPE_ARGS, (char_u *)_("pre-vimrc command line"), 0);
+       ESTACK_CHECK_SETUP
  # ifdef FEAT_EVAL
        current_sctx.sc_sid = SID_CMDARG;
  # endif
        for (i = 0; i < cnt; ++i)
            do_cmdline_cmd(cmds[i]);
+       ESTACK_CHECK_NOW
        estack_pop();
  # ifdef FEAT_EVAL
        current_sctx.sc_sid = 0;
***************
*** 3111,3116 ****
--- 3114,3120 ----
  exe_commands(mparm_T *parmp)
  {
      int               i;
+     ESTACK_CHECK_DECLARATION
  
      /*
       * We start commands on line 0, make "vim +/pat file" match a
***************
*** 3121,3126 ****
--- 3125,3131 ----
      if (parmp->tagname == NULL && curwin->w_cursor.lnum <= 1)
        curwin->w_cursor.lnum = 0;
      estack_push(ETYPE_ARGS, (char_u *)"command line", 0);
+     ESTACK_CHECK_SETUP
  #ifdef FEAT_EVAL
      current_sctx.sc_sid = SID_CARG;
      current_sctx.sc_seq = 0;
***************
*** 3131,3136 ****
--- 3136,3142 ----
        if (parmp->cmds_tofree[i])
            vim_free(parmp->commands[i]);
      }
+     ESTACK_CHECK_NOW
      estack_pop();
  #ifdef FEAT_EVAL
      current_sctx.sc_sid = 0;
***************
*** 3340,3351 ****
--- 3346,3359 ----
  #ifdef FEAT_EVAL
      sctx_T    save_current_sctx;
  #endif
+     ESTACK_CHECK_DECLARATION
  
      if ((initstr = mch_getenv(env)) != NULL && *initstr != NUL)
      {
        if (is_viminit)
            vimrc_found(NULL, NULL);
        estack_push(ETYPE_ENV, env, 0);
+       ESTACK_CHECK_SETUP
  #ifdef FEAT_EVAL
        save_current_sctx = current_sctx;
        current_sctx.sc_sid = SID_ENV;
***************
*** 3355,3360 ****
--- 3363,3369 ----
  #endif
        do_cmdline_cmd(initstr);
  
+       ESTACK_CHECK_NOW
        estack_pop();
  #ifdef FEAT_EVAL
        current_sctx = save_current_sctx;
*** ../vim-8.2.0097/src/map.c   2019-12-29 23:04:20.290639897 +0100
--- src/map.c   2020-01-07 20:36:55.214178671 +0100
***************
*** 1918,1927 ****
--- 1918,1929 ----
      int               abbr;
      int               hash;
      buf_T     *bp;
+     ESTACK_CHECK_DECLARATION
  
      validate_maphash();
      // avoids giving error messages
      estack_push(ETYPE_INTERNAL, (char_u *)"mappings", 0);
+     ESTACK_CHECK_SETUP
  
      // Do this once for each buffer, and then once for global
      // mappings/abbreviations with bp == NULL
***************
*** 1978,1983 ****
--- 1980,1986 ----
        if (bp == NULL)
            break;
      }
+     ESTACK_CHECK_NOW
      estack_pop();
  }
  
*** ../vim-8.2.0097/src/scriptfile.c    2020-01-06 19:53:38.882236516 +0100
--- src/scriptfile.c    2020-01-07 20:36:59.874160361 +0100
***************
*** 1099,1104 ****
--- 1099,1105 ----
      proftime_T                    wait_start;
  #endif
      int                           trigger_source_post = FALSE;
+     ESTACK_CHECK_DECLARATION
  
      p = expand_env_save(fname);
      if (p == NULL)
***************
*** 1216,1221 ****
--- 1217,1223 ----
  
      // Keep the sourcing name/lnum, for recursive calls.
      estack_push(ETYPE_SCRIPT, fname_exp, 0);
+     ESTACK_CHECK_SETUP
  
  #ifdef STARTUPTIME
      if (time_fd != NULL)
***************
*** 1355,1360 ****
--- 1357,1363 ----
  
      if (got_int)
        emsg(_(e_interr));
+     ESTACK_CHECK_NOW
      estack_pop();
      if (p_verbose > 1)
      {
*** ../vim-8.2.0097/src/spellfile.c     2020-01-07 20:11:38.152168717 +0100
--- src/spellfile.c     2020-01-07 20:42:18.832924611 +0100
***************
*** 353,358 ****
--- 353,359 ----
      int               c = 0;
      int               res;
      int               did_estack_push = FALSE;
+     ESTACK_CHECK_DECLARATION
  
      fd = mch_fopen((char *)fname, "r");
      if (fd == NULL)
***************
*** 393,398 ****
--- 394,400 ----
  
      // Set sourcing_name, so that error messages mention the file name.
      estack_push(ETYPE_SPELL, fname, 0);
+     ESTACK_CHECK_SETUP
      did_estack_push = TRUE;
  
      /*
***************
*** 581,587 ****
--- 583,592 ----
      if (fd != NULL)
        fclose(fd);
      if (did_estack_push)
+     {
+       ESTACK_CHECK_NOW
        estack_pop();
+     }
  
      return lp;
  }
*** ../vim-8.2.0097/src/userfunc.c      2020-01-02 14:31:17.944876303 +0100
--- src/userfunc.c      2020-01-07 20:37:37.106014337 +0100
***************
*** 793,798 ****
--- 793,799 ----
      proftime_T        call_start;
      int               started_profiling = FALSE;
  #endif
+     ESTACK_CHECK_DECLARATION
  
      // If depth of calling is getting too high, don't execute the function
      if (depth >= p_mfd)
***************
*** 969,974 ****
--- 970,976 ----
      }
  
      estack_push_ufunc(ETYPE_UFUNC, fp, 1);
+     ESTACK_CHECK_SETUP
      if (p_verbose >= 12)
      {
        ++no_wait_return;
***************
*** 1115,1120 ****
--- 1117,1123 ----
        --no_wait_return;
      }
  
+     ESTACK_CHECK_NOW
      estack_pop();
      current_sctx = save_current_sctx;
  #ifdef FEAT_PROFILE
*** ../vim-8.2.0097/src/version.c       2020-01-07 20:11:38.152168717 +0100
--- src/version.c       2020-01-07 20:49:36.487266082 +0100
***************
*** 744,745 ****
--- 744,747 ----
  {   /* Add new patch number below this line */
+ /**/
+     98,
  /**/

-- 
It is illegal for anyone to give lighted cigars to dogs, cats, and other
domesticated animal kept as pets.
                [real standing law in Illinois, United States of America]

 /// 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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202001072000.007K06R6004880%40masaka.moolenaar.net.

Raspunde prin e-mail lui