# HG changeset patch # User Bram Moolenaar # Date 1635886806 -3600 # Node ID ad90d7eee2364cc45b290d32bf7d7ae099858dad # Parent e182217c98050b94a6e0470bfadeeca81d9b3641 patch 8.2.3572: memory leak when closing window and using "multispace" Commit: https://github.com/vim/vim/commit/7a33ebfc5b04353aa7674972087d581def8fdcc1 Author: zeertzjq 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) diff --git a/src/testdir/test_listchars.vim b/src/testdir/test_listchars.vim --- 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 diff --git a/src/version.c b/src/version.c --- 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, diff --git a/src/window.c b/src/window.c --- 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);