]> granicus.if.org Git - vim/commitdiff
patch 8.1.0066: nasty autocommand causes using freed memory v8.1.0066
authorBram Moolenaar <Bram@vim.org>
Sun, 17 Jun 2018 15:32:58 +0000 (17:32 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 17 Jun 2018 15:32:58 +0000 (17:32 +0200)
Problem:    Nasty autocommand causes using freed memory. (Dominique Pelle)
Solution:   Do not force executing autocommands if the value of 'syntax' or
            'filetype' did not change.

src/option.c
src/version.c

index 23560798a156106e9317cd3f519c4833e9782448..2ecdcea649e9917a0cacdb9f3bc32304ff6c6a2f 100644 (file)
@@ -6029,7 +6029,7 @@ did_set_string_option(
     /* set when changing an option that only requires a redraw in the GUI */
     int                redraw_gui_only = FALSE;
 #endif
-    int                ft_changed = FALSE;
+    int                value_changed = FALSE;
 #if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS)
     int                did_swaptcap = FALSE;
 #endif
@@ -7437,7 +7437,7 @@ did_set_string_option(
        if (!valid_filetype(*varp))
            errmsg = e_invarg;
        else
-           ft_changed = STRCMP(oldval, *varp) != 0;
+           value_changed = STRCMP(oldval, *varp) != 0;
     }
 
 #ifdef FEAT_SYN_HL
@@ -7445,6 +7445,8 @@ did_set_string_option(
     {
        if (!valid_filetype(*varp))
            errmsg = e_invarg;
+       else
+           value_changed = STRCMP(oldval, *varp) != 0;
     }
 #endif
 
@@ -7565,20 +7567,24 @@ did_set_string_option(
        /* When 'syntax' is set, load the syntax of that name */
        if (varp == &(curbuf->b_p_syn))
        {
+           // Only pass TRUE for "force" when the value changed, to avoid
+           // endless recurrence. */
            apply_autocmds(EVENT_SYNTAX, curbuf->b_p_syn,
-                                              curbuf->b_fname, TRUE, curbuf);
+                                      curbuf->b_fname, value_changed, curbuf);
        }
 #endif
        else if (varp == &(curbuf->b_p_ft))
        {
            /* 'filetype' is set, trigger the FileType autocommand.
             * Skip this when called from a modeline and the filetype was
-            * already set to this value. */
-           if (!(opt_flags & OPT_MODELINE) || ft_changed)
+            * already set to this value.
+            * Only pass TRUE for "force" when the value changed, to avoid
+            * endless recurrence. */
+           if (!(opt_flags & OPT_MODELINE) || value_changed)
            {
                did_filetype = TRUE;
                apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft,
-                                              curbuf->b_fname, TRUE, curbuf);
+                                      curbuf->b_fname, value_changed, curbuf);
                /* Just in case the old "curbuf" is now invalid. */
                if (varp != &(curbuf->b_p_ft))
                    varp = NULL;
index 192b6cd2aa71a1ae9acda94dc0d49948b462700a..d3c7316c918ef2d2ec431859d41b661d1ac8ca52 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    66,
 /**/
     65,
 /**/