changeset 26077:ad90d7eee236 v8.2.3572

patch 8.2.3572: memory leak when closing window and using "multispace" Commit: https://github.com/vim/vim/commit/7a33ebfc5b04353aa7674972087d581def8fdcc1 Author: zeertzjq <zeertzjq@outlook.com> Date: Tue Nov 2 20:56:07 2021 +0000 patch 8.2.3572: memory leak when closing window and using "multispace" Problem: Memory leak when closing window and using "multispace" in 'listchars'. Solution: Free the memory. (closes #9071)
author Bram Moolenaar <Bram@vim.org>
date Tue, 02 Nov 2021 22:00:06 +0100
parents e182217c9805
children 42fae7319298
files src/testdir/test_listchars.vim src/version.c src/window.c
diffstat 3 files changed, 15 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_listchars.vim
+++ b/src/testdir/test_listchars.vim
@@ -445,7 +445,7 @@ func Test_listchars_window_local()
   call assert_equal(['{......}--one==two##$'], ScreenLines(1, virtcol('$')))
 
   " Setting the global setting to the default value should not impact a window
-  " using a local setting
+  " using a local setting.
   split
   setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
   setglobal listchars&vim
@@ -454,7 +454,7 @@ func Test_listchars_window_local()
   call assert_equal(['^I  one  two  $'], ScreenLines(1, virtcol('$')))
 
   " Setting the local setting to the default value should not impact a window
-  " using a global setting
+  " using a global setting.
   set listchars=tab:{.},lead:-,space:=,trail:#,eol:$
   split
   setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
@@ -465,7 +465,7 @@ func Test_listchars_window_local()
   call assert_equal(['{......}--one==two##$'], ScreenLines(1, virtcol('$')))
 
   " Using set in a window with a local setting should change it to use the
-  " global setting and also impact other windows using the global setting
+  " global setting and also impact other windows using the global setting.
   split
   setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
   call assert_equal(['<------>__one..two@@#'], ScreenLines(1, virtcol('$')))
@@ -475,7 +475,7 @@ func Test_listchars_window_local()
   call assert_equal(['+------+^^one>>two<<%'], ScreenLines(1, virtcol('$')))
 
   " Setting invalid value for a local setting should not impact the local and
-  " global settings
+  " global settings.
   split
   setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
   let cmd = 'setlocal listchars=tab:{.},lead:-,space:=,trail:#,eol:$,x'
@@ -485,7 +485,7 @@ func Test_listchars_window_local()
   call assert_equal(['+------+^^one>>two<<%'], ScreenLines(1, virtcol('$')))
 
   " Setting invalid value for a global setting should not impact the local and
-  " global settings
+  " global settings.
   split
   setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
   let cmd = 'setglobal listchars=tab:{.},lead:-,space:=,trail:#,eol:$,x'
@@ -494,6 +494,12 @@ func Test_listchars_window_local()
   close
   call assert_equal(['+------+^^one>>two<<%'], ScreenLines(1, virtcol('$')))
 
+  " Closing window with local lcs-multispace should not cause a memory leak.
+  setlocal listchars=multispace:---+
+  split
+  call s:CheckListCharsValue('multispace:---+')
+  close
+
   %bw!
   set list& listchars&
 endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3572,
+/**/
     3571,
 /**/
     3570,
--- a/src/window.c
+++ b/src/window.c
@@ -5041,6 +5041,8 @@ win_free(
     clear_winopt(&wp->w_onebuf_opt);
     clear_winopt(&wp->w_allbuf_opt);
 
+    vim_free(wp->w_lcs_chars.multispace);
+
 #ifdef FEAT_EVAL
     vars_clear(&wp->w_vars->dv_hashtab);	// free all w: variables
     hash_init(&wp->w_vars->dv_hashtab);