To: vim_dev@googlegroups.com Subject: Patch 8.0.0365 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@Moolenaar.net -- 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 ///