]> granicus.if.org Git - vim/commitdiff
patch 8.1.0936: may leak memory when using 'vartabstop' v8.1.0936
authorBram Moolenaar <Bram@vim.org>
Sat, 16 Feb 2019 18:05:11 +0000 (19:05 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 16 Feb 2019 18:05:11 +0000 (19:05 +0100)
Problem:    May leak memory when using 'vartabstop'. (Kuang-che Wu)
Solution:   Fix handling allocated memory for 'vartabstop'. (closes #3976)

src/buffer.c
src/option.c
src/version.c

index db0c591613d9f5987d8deb710966eff0bb5aaaf7..49d38ed31d2fc834cf14861c34ae982597a360ba 100644 (file)
@@ -2170,9 +2170,7 @@ free_buf_options(
        vim_free(buf->b_p_vsts_array);
     buf->b_p_vsts_array = NULL;
     clear_string_option(&buf->b_p_vts);
-    if (buf->b_p_vts_array)
-       vim_free(buf->b_p_vts_array);
-    buf->b_p_vts_array = NULL;
+    VIM_CLEAR(buf->b_p_vts_array);
 #endif
 #ifdef FEAT_KEYMAP
     clear_string_option(&buf->b_p_keymap);
index b9fe3dabef37b823caf1557a7af2cab1cd93d632..eec8fe0520cabc5a95905bf7e04732e4d9d254e4 100644 (file)
@@ -5594,7 +5594,9 @@ didset_options2(void)
     (void)check_clipboard_option();
 #endif
 #ifdef FEAT_VARTABS
+    vim_free(curbuf->b_p_vsts_array);
     tabstop_set(curbuf->b_p_vsts, &curbuf->b_p_vsts_array);
+    vim_free(curbuf->b_p_vts_array);
     tabstop_set(curbuf->b_p_vts,  &curbuf->b_p_vts_array);
 #endif
 }
@@ -7572,14 +7574,14 @@ did_set_string_option(
            if (errmsg == NULL)
            {
                int *oldarray = curbuf->b_p_vts_array;
+
                if (tabstop_set(*varp, &(curbuf->b_p_vts_array)))
                {
-                   if (oldarray)
-                       vim_free(oldarray);
+                   vim_free(oldarray);
 #ifdef FEAT_FOLDING
                    if (foldmethodIsIndent(curwin))
                        foldUpdateAll(curwin);
-#endif /* FEAT_FOLDING */
+#endif
                }
                else
                    errmsg = e_invarg;
@@ -12706,10 +12708,11 @@ check_ff_value(char_u *p)
     return check_opt_strings(p, p_ff_values, FALSE);
 }
 
-#ifdef FEAT_VARTABS
+#if defined(FEAT_VARTABS) || defined(PROTO)
 
 /*
  * Set the integer values corresponding to the string setting of 'vartabstop'.
+ * "array" will be set, caller must free it if needed.
  */
     int
 tabstop_set(char_u *var, int **array)
@@ -12752,6 +12755,8 @@ tabstop_set(char_u *var, int **array)
     }
 
     *array = (int *)alloc((unsigned) ((valcount + 1) * sizeof(int)));
+    if (*array == NULL)
+       return FALSE;
     (*array)[0] = valcount;
 
     t = 1;
index 8dd86f0b00df8cda10082b17c2bca67235bebfaa..81bafe5781af12c0d5b4155c9d1edd8ab65dc617 100644 (file)
@@ -779,6 +779,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    936,
 /**/
     935,
 /**/