Skip to content

Commit 95c526e

Browse files
committed
patch 8.0.0365: might free a dict item that wasn't allocated
Problem: Might free a dict item that wasn't allocated. Solution: Call dictitem_free(). (Nikolai Pavlov) Use this for b:changedtick.
1 parent d3f78dc commit 95c526e

File tree

12 files changed

+40
-50
lines changed

12 files changed

+40
-50
lines changed

src/buffer.c

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -832,7 +832,6 @@ free_buffer(buf_T *buf)
832832
free_buffer_stuff(buf, TRUE);
833833
#ifdef FEAT_EVAL
834834
unref_var_dict(buf->b_vars);
835-
buf->b_changedtick = &buf->b_ct_val;
836835
#endif
837836
#ifdef FEAT_LUA
838837
lua_buffer_free(buf);
@@ -874,31 +873,20 @@ free_buffer(buf_T *buf)
874873
}
875874

876875
/*
877-
* Initializes buf->b_changedtick.
876+
* Initializes b:changedtick.
878877
*/
879878
static void
880879
init_changedtick(buf_T *buf)
881880
{
882-
#ifdef FEAT_EVAL
883-
dictitem_T *di = dictitem_alloc((char_u *)"changedtick");
881+
dictitem_T *di = (dictitem_T *)&buf->b_ct_di;
884882

885-
if (di != NULL)
886-
{
887-
di->di_flags |= DI_FLAGS_FIX | DI_FLAGS_RO;
888-
di->di_tv.v_type = VAR_NUMBER;
889-
di->di_tv.v_lock = VAR_FIXED;
890-
di->di_tv.vval.v_number = 0;
891-
if (dict_add(buf->b_vars, di) == OK)
892-
buf->b_changedtick = &di->di_tv.vval.v_number;
893-
else
894-
{
895-
vim_free(di);
896-
buf->b_changedtick = &buf->b_ct_val;
897-
}
898-
}
899-
else
900-
#endif
901-
buf->b_changedtick = &buf->b_ct_val;
883+
di->di_flags = DI_FLAGS_FIX | DI_FLAGS_RO;
884+
di->di_tv.v_type = VAR_NUMBER;
885+
di->di_tv.v_lock = VAR_FIXED;
886+
di->di_tv.vval.v_number = 0;
887+
888+
STRCPY(buf->b_ct_di.di_key, "changedtick");
889+
(void)dict_add(buf->b_vars, di);
902890
}
903891

904892
/*
@@ -919,12 +907,12 @@ free_buffer_stuff(
919907
}
920908
#ifdef FEAT_EVAL
921909
{
922-
varnumber_T tick = *buf->b_changedtick;
910+
varnumber_T tick = CHANGEDTICK(buf);
923911

924912
vars_clear(&buf->b_vars->dv_hashtab); /* free all buffer variables */
925913
hash_init(&buf->b_vars->dv_hashtab);
926914
init_changedtick(buf);
927-
*buf->b_changedtick = tick;
915+
CHANGEDTICK(buf) = tick;
928916
}
929917
#endif
930918
#ifdef FEAT_USR_CMDS

src/dict.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,7 @@ dict_free_contents(dict_T *d)
8888
* something recursive causing trouble. */
8989
di = HI2DI(hi);
9090
hash_remove(&d->dv_hashtab, hi);
91-
clear_tv(&di->di_tv);
92-
vim_free(di);
91+
dictitem_free(di);
9392
--todo;
9493
}
9594
}

src/edit.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,7 +1668,7 @@ ins_redraw(
16681668
#ifdef FEAT_AUTOCMD
16691669
/* Trigger TextChangedI if b_changedtick differs. */
16701670
if (ready && has_textchangedI()
1671-
&& last_changedtick != *curbuf->b_changedtick
1671+
&& last_changedtick != CHANGEDTICK(curbuf)
16721672
# ifdef FEAT_INS_EXPAND
16731673
&& !pum_visible()
16741674
# endif
@@ -1677,7 +1677,7 @@ ins_redraw(
16771677
if (last_changedtick_buf == curbuf)
16781678
apply_autocmds(EVENT_TEXTCHANGEDI, NULL, NULL, FALSE, curbuf);
16791679
last_changedtick_buf = curbuf;
1680-
last_changedtick = *curbuf->b_changedtick;
1680+
last_changedtick = CHANGEDTICK(curbuf);
16811681
}
16821682
#endif
16831683

src/evalfunc.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2550,7 +2550,7 @@ f_diff_hlID(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
25502550
if (lnum < 0) /* ignore type error in {lnum} arg */
25512551
lnum = 0;
25522552
if (lnum != prev_lnum
2553-
|| changedtick != *curbuf->b_changedtick
2553+
|| changedtick != CHANGEDTICK(curbuf)
25542554
|| fnum != curbuf->b_fnum)
25552555
{
25562556
/* New line, buffer, change: need to get the values. */
@@ -2572,7 +2572,7 @@ f_diff_hlID(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
25722572
else
25732573
hlID = (hlf_T)0;
25742574
prev_lnum = lnum;
2575-
changedtick = *curbuf->b_changedtick;
2575+
changedtick = CHANGEDTICK(curbuf);
25762576
fnum = curbuf->b_fnum;
25772577
}
25782578

@@ -3957,7 +3957,7 @@ get_buffer_info(buf_T *buf)
39573957
dict_add_nr_str(dict, "loaded", buf->b_ml.ml_mfp != NULL, NULL);
39583958
dict_add_nr_str(dict, "listed", buf->b_p_bl, NULL);
39593959
dict_add_nr_str(dict, "changed", bufIsChanged(buf), NULL);
3960-
dict_add_nr_str(dict, "changedtick", *buf->b_changedtick, NULL);
3960+
dict_add_nr_str(dict, "changedtick", CHANGEDTICK(buf), NULL);
39613961
dict_add_nr_str(dict, "hidden",
39623962
buf->b_ml.ml_mfp != NULL && buf->b_nwindows == 0,
39633963
NULL);

src/ex_docmd.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,7 @@ do_exmode(
660660
need_wait_return = FALSE;
661661
ex_pressedreturn = FALSE;
662662
ex_no_reprint = FALSE;
663-
changedtick = *curbuf->b_changedtick;
663+
changedtick = CHANGEDTICK(curbuf);
664664
prev_msg_row = msg_row;
665665
prev_line = curwin->w_cursor.lnum;
666666
if (improved)
@@ -673,7 +673,7 @@ do_exmode(
673673
lines_left = Rows - 1;
674674

675675
if ((prev_line != curwin->w_cursor.lnum
676-
|| changedtick != *curbuf->b_changedtick) && !ex_no_reprint)
676+
|| changedtick != CHANGEDTICK(curbuf)) && !ex_no_reprint)
677677
{
678678
if (curbuf->b_ml.ml_flags & ML_EMPTY)
679679
EMSG(_(e_emptybuf));

src/fileio.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4924,11 +4924,11 @@ buf_write(
49244924
{
49254925
unchanged(buf, TRUE);
49264926
#ifdef FEAT_AUTOCMD
4927-
/* buf->b_changedtick is always incremented in unchanged() but that
4927+
/* b:changedtick is always incremented in unchanged() but that
49284928
* should not trigger a TextChanged event. */
4929-
if (last_changedtick + 1 == *buf->b_changedtick
4929+
if (last_changedtick + 1 == CHANGEDTICK(buf)
49304930
&& last_changedtick_buf == buf)
4931-
last_changedtick = *buf->b_changedtick;
4931+
last_changedtick = CHANGEDTICK(buf);
49324932
#endif
49334933
u_unchanged(buf);
49344934
u_update_save_nr(buf);

src/main.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,15 +1162,15 @@ main_loop(
11621162
#endif
11631163

11641164
#ifdef FEAT_AUTOCMD
1165-
/* Trigger TextChanged if b_changedtick differs. */
1165+
/* Trigger TextChanged if b:changedtick differs. */
11661166
if (!finish_op && has_textchanged()
1167-
&& last_changedtick != *curbuf->b_changedtick)
1167+
&& last_changedtick != CHANGEDTICK(curbuf))
11681168
{
11691169
if (last_changedtick_buf == curbuf)
11701170
apply_autocmds(EVENT_TEXTCHANGED, NULL, NULL,
11711171
FALSE, curbuf);
11721172
last_changedtick_buf = curbuf;
1173-
last_changedtick = *curbuf->b_changedtick;
1173+
last_changedtick = CHANGEDTICK(curbuf);
11741174
}
11751175
#endif
11761176

@@ -1388,11 +1388,11 @@ getout(int exitval)
13881388
/* Autocmd must have close the buffer already, skip. */
13891389
continue;
13901390
buf = wp->w_buffer;
1391-
if (buf->b_ct_val != -1)
1391+
if (CHANGEDTICK(buf) != -1)
13921392
{
13931393
apply_autocmds(EVENT_BUFWINLEAVE, buf->b_fname,
13941394
buf->b_fname, FALSE, buf);
1395-
buf->b_ct_val = -1; /* note that we did it already */
1395+
CHANGEDTICK(buf) = -1; /* note that we did it already */
13961396
/* start all over, autocommands may mess up the lists */
13971397
next_tp = first_tabpage;
13981398
break;

src/memline.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1649,7 +1649,7 @@ ml_recover(void)
16491649
if (!(curbuf->b_ml.ml_line_count == 2 && *ml_get(1) == NUL))
16501650
{
16511651
changed_int();
1652-
++*curbuf->b_changedtick;
1652+
++CHANGEDTICK(curbuf);
16531653
}
16541654
}
16551655
else
@@ -1663,7 +1663,7 @@ ml_recover(void)
16631663
if (i != 0)
16641664
{
16651665
changed_int();
1666-
++*curbuf->b_changedtick;
1666+
++CHANGEDTICK(curbuf);
16671667
break;
16681668
}
16691669
}

src/misc1.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -502,11 +502,11 @@ get_breakindent_win(
502502

503503
/* used cached indent, unless pointer or 'tabstop' changed */
504504
if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts
505-
|| prev_tick != *wp->w_buffer->b_changedtick)
505+
|| prev_tick != CHANGEDTICK(wp->w_buffer))
506506
{
507507
prev_line = line;
508508
prev_ts = wp->w_buffer->b_p_ts;
509-
prev_tick = *wp->w_buffer->b_changedtick;
509+
prev_tick = CHANGEDTICK(wp->w_buffer);
510510
prev_indent = get_indent_str(line,
511511
(int)wp->w_buffer->b_p_ts, wp->w_p_list);
512512
}
@@ -2768,7 +2768,7 @@ changed(void)
27682768
}
27692769
changed_int();
27702770
}
2771-
++*curbuf->b_changedtick;
2771+
++CHANGEDTICK(curbuf);
27722772
}
27732773

27742774
/*
@@ -3195,7 +3195,7 @@ unchanged(
31953195
need_maketitle = TRUE; /* set window title later */
31963196
#endif
31973197
}
3198-
++*buf->b_changedtick;
3198+
++CHANGEDTICK(buf);
31993199
#ifdef FEAT_NETBEANS_INTG
32003200
netbeans_unmodified(buf);
32013201
#endif

src/structs.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1916,9 +1916,10 @@ struct file_buffer
19161916

19171917
int b_changed; /* 'modified': Set to TRUE if something in the
19181918
file has been changed and not written out. */
1919-
varnumber_T *b_changedtick; /* points into b:changedtick or b_ct_val;
1919+
dictitem16_T b_ct_di; /* holds the b:changedtick value in
1920+
b_ct_di.di_tv.vval.v_number;
19201921
incremented for each change, also for undo */
1921-
varnumber_T b_ct_val; /* fallback for b:changedtick */
1922+
#define CHANGEDTICK(buf) ((buf)->b_ct_di.di_tv.vval.v_number)
19221923

19231924
int b_saving; /* Set to TRUE if we are in the middle of
19241925
saving the buffer. */

0 commit comments

Comments
 (0)