diff src/syntax.c @ 2252:a0b5918c33cc vim73

Fixed memory leak in ":ownsyntax".
author Bram Moolenaar <bram@vim.org>
date Sun, 06 Jun 2010 15:21:10 +0200
parents 646d34788036
children 12ebd6f6dfce
line wrap: on
line diff
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -3537,8 +3537,7 @@ syn_cmd_clear(eap, syncing)
 	    syntax_clear(curwin->w_s);
 	    if (curwin->w_s == &curwin->w_buffer->b_s)
 		do_unlet((char_u *)"b:current_syntax", TRUE);
-	    else
-		do_unlet((char_u *)"w:current_syntax", TRUE);
+	    do_unlet((char_u *)"w:current_syntax", TRUE);
 
 	}
     }
@@ -6157,6 +6156,9 @@ ex_syntax(eap)
 ex_ownsyntax(eap)
     exarg_T	*eap;
 {
+    char_u	*old_value;
+    char_u	*new_value;
+
     if (curwin->w_s == &curwin->w_buffer->b_s)
     {
 	curwin->w_s = (synblock_T *)alloc(sizeof(synblock_T));
@@ -6170,7 +6172,26 @@ ex_ownsyntax(eap)
 	clear_string_option(&curwin->w_s->b_p_spl);
 #endif
     }
+
+    /* save value of b:current_syntax */
+    old_value = get_var_value((char_u *)"b:current_syntax");
+    if (old_value != NULL)
+	old_value = vim_strsave(old_value);
+
+    /* Apply the "syntax" autocommand event, this finds and loads the syntax
+     * file. */
     apply_autocmds(EVENT_SYNTAX, eap->arg, curbuf->b_fname, TRUE, curbuf);
+
+    /* move value of b:current_syntax to w:current_syntax */
+    new_value = get_var_value((char_u *)"b:current_syntax");
+    set_internal_string_var((char_u *)"w:current_syntax", new_value);
+
+    /* restore value of b:current_syntax */
+    if (old_value != NULL)
+    {
+	set_internal_string_var((char_u *)"b:current_syntax", old_value);
+	vim_free(old_value);
+    }
 }
 
     int