Patch 8.0.0365
Problem:    Might free a dict item that wasn't allocated.
Solution:   Call dictitem_free(). (Nikolai Pavlov)  Use this for
            b:changedtick.
Files:      src/dict.c, src/structs.h, src/buffer.c, src/edit.c,
            src/evalfunc.c, src/ex_docmd.c, src/fileio.c, src/main.c,
            src/memline.c, src/misc1.c, src/syntax.c


*** ../vim-8.0.0364/src/dict.c  2016-11-10 20:01:41.181582995 +0100
--- src/dict.c  2017-02-25 14:33:33.327756619 +0100
***************
*** 88,95 ****
             * something recursive causing trouble. */
            di = HI2DI(hi);
            hash_remove(&d->dv_hashtab, hi);
!           clear_tv(&di->di_tv);
!           vim_free(di);
            --todo;
        }
      }
--- 88,94 ----
             * something recursive causing trouble. */
            di = HI2DI(hi);
            hash_remove(&d->dv_hashtab, hi);
!           dictitem_free(di);
            --todo;
        }
      }
*** ../vim-8.0.0364/src/structs.h       2017-02-17 16:31:16.909294226 +0100
--- src/structs.h       2017-02-25 14:39:55.349390887 +0100
***************
*** 1916,1924 ****
  
      int               b_changed;      /* 'modified': Set to TRUE if something 
in the
                                   file has been changed and not written out. */
!     varnumber_T       *b_changedtick; /* points into b:changedtick or 
b_ct_val;
                                   incremented for each change, also for undo */
!     varnumber_T b_ct_val;     /* fallback for b:changedtick */
  
      int               b_saving;       /* Set to TRUE if we are in the middle 
of
                                   saving the buffer. */
--- 1916,1925 ----
  
      int               b_changed;      /* 'modified': Set to TRUE if something 
in the
                                   file has been changed and not written out. */
!     dictitem16_T b_ct_di;     /* holds the b:changedtick value in
!                                  b_ct_di.di_tv.vval.v_number;
                                   incremented for each change, also for undo */
! #define CHANGEDTICK(buf) ((buf)->b_ct_di.di_tv.vval.v_number)
  
      int               b_saving;       /* Set to TRUE if we are in the middle 
of
                                   saving the buffer. */
*** ../vim-8.0.0364/src/buffer.c        2017-02-21 20:47:09.958394797 +0100
--- src/buffer.c        2017-02-25 14:50:32.457430069 +0100
***************
*** 832,838 ****
      free_buffer_stuff(buf, TRUE);
  #ifdef FEAT_EVAL
      unref_var_dict(buf->b_vars);
-     buf->b_changedtick = &buf->b_ct_val;
  #endif
  #ifdef FEAT_LUA
      lua_buffer_free(buf);
--- 832,837 ----
***************
*** 874,904 ****
  }
  
  /*
!  * Initializes buf->b_changedtick.
   */
      static void
  init_changedtick(buf_T *buf)
  {
! #ifdef FEAT_EVAL
!     dictitem_T *di = dictitem_alloc((char_u *)"changedtick");
  
!     if (di != NULL)
!     {
!       di->di_flags |= DI_FLAGS_FIX | DI_FLAGS_RO;
!       di->di_tv.v_type = VAR_NUMBER;
!       di->di_tv.v_lock = VAR_FIXED;
!       di->di_tv.vval.v_number = 0;
!       if (dict_add(buf->b_vars, di) == OK)
!           buf->b_changedtick = &di->di_tv.vval.v_number;
!       else
!       {
!           vim_free(di);
!           buf->b_changedtick = &buf->b_ct_val;
!       }
!     }
!     else
! #endif
!       buf->b_changedtick = &buf->b_ct_val;
  }
  
  /*
--- 873,892 ----
  }
  
  /*
!  * Initializes b:changedtick.
   */
      static void
  init_changedtick(buf_T *buf)
  {
!     dictitem_T *di = (dictitem_T *)&buf->b_ct_di;
  
!     di->di_flags = DI_FLAGS_FIX | DI_FLAGS_RO;
!     di->di_tv.v_type = VAR_NUMBER;
!     di->di_tv.v_lock = VAR_FIXED;
!     di->di_tv.vval.v_number = 0;
! 
!     STRCPY(buf->b_ct_di.di_key, "changedtick");
!     (void)dict_add(buf->b_vars, di);
  }
  
  /*
***************
*** 919,930 ****
      }
  #ifdef FEAT_EVAL
      {
!       varnumber_T tick = *buf->b_changedtick;
  
        vars_clear(&buf->b_vars->dv_hashtab); /* free all buffer variables */
        hash_init(&buf->b_vars->dv_hashtab);
        init_changedtick(buf);
!       *buf->b_changedtick = tick;
      }
  #endif
  #ifdef FEAT_USR_CMDS
--- 907,918 ----
      }
  #ifdef FEAT_EVAL
      {
!       varnumber_T tick = CHANGEDTICK(buf);
  
        vars_clear(&buf->b_vars->dv_hashtab); /* free all buffer variables */
        hash_init(&buf->b_vars->dv_hashtab);
        init_changedtick(buf);
!       CHANGEDTICK(buf) = tick;
      }
  #endif
  #ifdef FEAT_USR_CMDS
*** ../vim-8.0.0364/src/edit.c  2017-02-23 18:08:51.324806489 +0100
--- src/edit.c  2017-02-25 14:44:35.111655103 +0100
***************
*** 1668,1674 ****
  #ifdef FEAT_AUTOCMD
      /* Trigger TextChangedI if b_changedtick differs. */
      if (ready && has_textchangedI()
!           && last_changedtick != *curbuf->b_changedtick
  # ifdef FEAT_INS_EXPAND
            && !pum_visible()
  # endif
--- 1668,1674 ----
  #ifdef FEAT_AUTOCMD
      /* Trigger TextChangedI if b_changedtick differs. */
      if (ready && has_textchangedI()
!           && last_changedtick != CHANGEDTICK(curbuf)
  # ifdef FEAT_INS_EXPAND
            && !pum_visible()
  # endif
***************
*** 1677,1683 ****
        if (last_changedtick_buf == curbuf)
            apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, FALSE, curbuf);
        last_changedtick_buf = curbuf;
!       last_changedtick = *curbuf->b_changedtick;
      }
  #endif
  
--- 1677,1683 ----
        if (last_changedtick_buf == curbuf)
            apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, FALSE, curbuf);
        last_changedtick_buf = curbuf;
!       last_changedtick = CHANGEDTICK(curbuf);
      }
  #endif
  
*** ../vim-8.0.0364/src/evalfunc.c      2017-02-21 20:47:09.966394747 +0100
--- src/evalfunc.c      2017-02-25 14:45:27.639327794 +0100
***************
*** 2550,2556 ****
      if (lnum < 0)     /* ignore type error in {lnum} arg */
        lnum = 0;
      if (lnum != prev_lnum
!           || changedtick != *curbuf->b_changedtick
            || fnum != curbuf->b_fnum)
      {
        /* New line, buffer, change: need to get the values. */
--- 2550,2556 ----
      if (lnum < 0)     /* ignore type error in {lnum} arg */
        lnum = 0;
      if (lnum != prev_lnum
!           || changedtick != CHANGEDTICK(curbuf)
            || fnum != curbuf->b_fnum)
      {
        /* New line, buffer, change: need to get the values. */
***************
*** 2572,2578 ****
        else
            hlID = (hlf_T)0;
        prev_lnum = lnum;
!       changedtick = *curbuf->b_changedtick;
        fnum = curbuf->b_fnum;
      }
  
--- 2572,2578 ----
        else
            hlID = (hlf_T)0;
        prev_lnum = lnum;
!       changedtick = CHANGEDTICK(curbuf);
        fnum = curbuf->b_fnum;
      }
  
***************
*** 3957,3963 ****
      dict_add_nr_str(dict, "loaded", buf->b_ml.ml_mfp != NULL, NULL);
      dict_add_nr_str(dict, "listed", buf->b_p_bl, NULL);
      dict_add_nr_str(dict, "changed", bufIsChanged(buf), NULL);
!     dict_add_nr_str(dict, "changedtick", *buf->b_changedtick, NULL);
      dict_add_nr_str(dict, "hidden",
                    buf->b_ml.ml_mfp != NULL && buf->b_nwindows == 0,
                    NULL);
--- 3957,3963 ----
      dict_add_nr_str(dict, "loaded", buf->b_ml.ml_mfp != NULL, NULL);
      dict_add_nr_str(dict, "listed", buf->b_p_bl, NULL);
      dict_add_nr_str(dict, "changed", bufIsChanged(buf), NULL);
!     dict_add_nr_str(dict, "changedtick", CHANGEDTICK(buf), NULL);
      dict_add_nr_str(dict, "hidden",
                    buf->b_ml.ml_mfp != NULL && buf->b_nwindows == 0,
                    NULL);
*** ../vim-8.0.0364/src/ex_docmd.c      2017-02-17 16:31:16.921294136 +0100
--- src/ex_docmd.c      2017-02-25 14:45:58.859133297 +0100
***************
*** 660,666 ****
        need_wait_return = FALSE;
        ex_pressedreturn = FALSE;
        ex_no_reprint = FALSE;
!       changedtick = *curbuf->b_changedtick;
        prev_msg_row = msg_row;
        prev_line = curwin->w_cursor.lnum;
        if (improved)
--- 660,666 ----
        need_wait_return = FALSE;
        ex_pressedreturn = FALSE;
        ex_no_reprint = FALSE;
!       changedtick = CHANGEDTICK(curbuf);
        prev_msg_row = msg_row;
        prev_line = curwin->w_cursor.lnum;
        if (improved)
***************
*** 673,679 ****
        lines_left = Rows - 1;
  
        if ((prev_line != curwin->w_cursor.lnum
!                  || changedtick != *curbuf->b_changedtick) && !ex_no_reprint)
        {
            if (curbuf->b_ml.ml_flags & ML_EMPTY)
                EMSG(_(e_emptybuf));
--- 673,679 ----
        lines_left = Rows - 1;
  
        if ((prev_line != curwin->w_cursor.lnum
!                  || changedtick != CHANGEDTICK(curbuf)) && !ex_no_reprint)
        {
            if (curbuf->b_ml.ml_flags & ML_EMPTY)
                EMSG(_(e_emptybuf));
*** ../vim-8.0.0364/src/fileio.c        2017-02-17 16:31:16.925294107 +0100
--- src/fileio.c        2017-02-25 14:46:43.194857144 +0100
***************
*** 4924,4934 ****
      {
        unchanged(buf, TRUE);
  #ifdef FEAT_AUTOCMD
!       /* buf->b_changedtick is always incremented in unchanged() but that
         * should not trigger a TextChanged event. */
!       if (last_changedtick + 1 == *buf->b_changedtick
                                               && last_changedtick_buf == buf)
!           last_changedtick = *buf->b_changedtick;
  #endif
        u_unchanged(buf);
        u_update_save_nr(buf);
--- 4924,4934 ----
      {
        unchanged(buf, TRUE);
  #ifdef FEAT_AUTOCMD
!       /* b:changedtick is always incremented in unchanged() but that
         * should not trigger a TextChanged event. */
!       if (last_changedtick + 1 == CHANGEDTICK(buf)
                                               && last_changedtick_buf == buf)
!           last_changedtick = CHANGEDTICK(buf);
  #endif
        u_unchanged(buf);
        u_update_save_nr(buf);
*** ../vim-8.0.0364/src/main.c  2017-02-17 16:31:16.921294136 +0100
--- src/main.c  2017-02-25 14:52:12.920805203 +0100
***************
*** 1162,1176 ****
  #endif
  
  #ifdef FEAT_AUTOCMD
!           /* Trigger TextChanged if b_changedtick differs. */
            if (!finish_op && has_textchanged()
!                   && last_changedtick != *curbuf->b_changedtick)
            {
                if (last_changedtick_buf == curbuf)
                    apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL,
                                                               FALSE, curbuf);
                last_changedtick_buf = curbuf;
!               last_changedtick = *curbuf->b_changedtick;
            }
  #endif
  
--- 1162,1176 ----
  #endif
  
  #ifdef FEAT_AUTOCMD
!           /* Trigger TextChanged if b:changedtick differs. */
            if (!finish_op && has_textchanged()
!                   && last_changedtick != CHANGEDTICK(curbuf))
            {
                if (last_changedtick_buf == curbuf)
                    apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL,
                                                               FALSE, curbuf);
                last_changedtick_buf = curbuf;
!               last_changedtick = CHANGEDTICK(curbuf);
            }
  #endif
  
***************
*** 1388,1398 ****
                    /* Autocmd must have close the buffer already, skip. */
                    continue;
                buf = wp->w_buffer;
!               if (buf->b_ct_val != -1)
                {
                    apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname,
                                                    buf->b_fname, FALSE, buf);
!                   buf->b_ct_val = -1;  /* note that we did it already */
                    /* start all over, autocommands may mess up the lists */
                    next_tp = first_tabpage;
                    break;
--- 1388,1398 ----
                    /* Autocmd must have close the buffer already, skip. */
                    continue;
                buf = wp->w_buffer;
!               if (CHANGEDTICK(buf) != -1)
                {
                    apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname,
                                                    buf->b_fname, FALSE, buf);
!                   CHANGEDTICK(buf) = -1;  /* note that we did it already */
                    /* start all over, autocommands may mess up the lists */
                    next_tp = first_tabpage;
                    break;
*** ../vim-8.0.0364/src/memline.c       2017-02-18 16:58:44.264503901 +0100
--- src/memline.c       2017-02-25 14:48:03.078359721 +0100
***************
*** 1649,1655 ****
        if (!(curbuf->b_ml.ml_line_count == 2 && *ml_get(1) == NUL))
        {
            changed_int();
!           ++*curbuf->b_changedtick;
        }
      }
      else
--- 1649,1655 ----
        if (!(curbuf->b_ml.ml_line_count == 2 && *ml_get(1) == NUL))
        {
            changed_int();
!           ++CHANGEDTICK(curbuf);
        }
      }
      else
***************
*** 1663,1669 ****
            if (i != 0)
            {
                changed_int();
!               ++*curbuf->b_changedtick;
                break;
            }
        }
--- 1663,1669 ----
            if (i != 0)
            {
                changed_int();
!               ++CHANGEDTICK(curbuf);
                break;
            }
        }
*** ../vim-8.0.0364/src/misc1.c 2017-02-23 17:07:10.308599718 +0100
--- src/misc1.c 2017-02-25 14:49:15.509908867 +0100
***************
*** 502,512 ****
  
      /* used cached indent, unless pointer or 'tabstop' changed */
      if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts
!                                 || prev_tick != *wp->w_buffer->b_changedtick)
      {
        prev_line = line;
        prev_ts = wp->w_buffer->b_p_ts;
!       prev_tick = *wp->w_buffer->b_changedtick;
        prev_indent = get_indent_str(line,
                                     (int)wp->w_buffer->b_p_ts, wp->w_p_list);
      }
--- 502,512 ----
  
      /* used cached indent, unless pointer or 'tabstop' changed */
      if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts
!                                 || prev_tick != CHANGEDTICK(wp->w_buffer))
      {
        prev_line = line;
        prev_ts = wp->w_buffer->b_p_ts;
!       prev_tick = CHANGEDTICK(wp->w_buffer);
        prev_indent = get_indent_str(line,
                                     (int)wp->w_buffer->b_p_ts, wp->w_p_list);
      }
***************
*** 2768,2774 ****
        }
        changed_int();
      }
!     ++*curbuf->b_changedtick;
  }
  
  /*
--- 2768,2774 ----
        }
        changed_int();
      }
!     ++CHANGEDTICK(curbuf);
  }
  
  /*
***************
*** 3195,3201 ****
        need_maketitle = TRUE;      /* set window title later */
  #endif
      }
!     ++*buf->b_changedtick;
  #ifdef FEAT_NETBEANS_INTG
      netbeans_unmodified(buf);
  #endif
--- 3195,3201 ----
        need_maketitle = TRUE;      /* set window title later */
  #endif
      }
!     ++CHANGEDTICK(buf);
  #ifdef FEAT_NETBEANS_INTG
      netbeans_unmodified(buf);
  #endif
*** ../vim-8.0.0364/src/syntax.c        2017-02-17 16:31:16.929294079 +0100
--- src/syntax.c        2017-02-25 14:49:57.257649075 +0100
***************
*** 516,528 ****
       */
      if (syn_block != wp->w_s
            || syn_buf != wp->w_buffer
!           || changedtick != *syn_buf->b_changedtick)
      {
        invalidate_current_state();
        syn_buf = wp->w_buffer;
        syn_block = wp->w_s;
      }
!     changedtick = *syn_buf->b_changedtick;
      syn_win = wp;
  
      /*
--- 516,528 ----
       */
      if (syn_block != wp->w_s
            || syn_buf != wp->w_buffer
!           || changedtick != CHANGEDTICK(syn_buf))
      {
        invalidate_current_state();
        syn_buf = wp->w_buffer;
        syn_block = wp->w_s;
      }
!     changedtick = CHANGEDTICK(syn_buf);
      syn_win = wp;
  
      /*
*** ../vim-8.0.0364/src/version.c       2017-02-25 14:20:56.784372170 +0100
--- src/version.c       2017-02-25 14:56:48.031095489 +0100
***************
*** 766,767 ****
--- 766,769 ----
  {   /* Add new patch number below this line */
+ /**/
+     365,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
22. You've already visited all the links at Yahoo and you're halfway through
    Lycos.

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