0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

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)
This commit is contained in:
zeertzjq
2021-11-02 20:56:07 +00:00
committed by Bram Moolenaar
parent e2f66064d1
commit 7a33ebfc5b
3 changed files with 15 additions and 5 deletions

View File

@@ -445,7 +445,7 @@ func Test_listchars_window_local()
call assert_equal(['{......}--one==two##$'], ScreenLines(1, virtcol('$'))) call assert_equal(['{......}--one==two##$'], ScreenLines(1, virtcol('$')))
" Setting the global setting to the default value should not impact a window " Setting the global setting to the default value should not impact a window
" using a local setting " using a local setting.
split split
setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:# setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
setglobal listchars&vim setglobal listchars&vim
@@ -454,7 +454,7 @@ func Test_listchars_window_local()
call assert_equal(['^I one two $'], ScreenLines(1, virtcol('$'))) call assert_equal(['^I one two $'], ScreenLines(1, virtcol('$')))
" Setting the local setting to the default value should not impact a window " 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:$ set listchars=tab:{.},lead:-,space:=,trail:#,eol:$
split split
setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:# setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
@@ -465,7 +465,7 @@ func Test_listchars_window_local()
call assert_equal(['{......}--one==two##$'], ScreenLines(1, virtcol('$'))) call assert_equal(['{......}--one==two##$'], ScreenLines(1, virtcol('$')))
" Using set in a window with a local setting should change it to use the " 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 split
setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:# setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
call assert_equal(['<------>__one..two@@#'], ScreenLines(1, virtcol('$'))) 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('$'))) call assert_equal(['+------+^^one>>two<<%'], ScreenLines(1, virtcol('$')))
" Setting invalid value for a local setting should not impact the local and " Setting invalid value for a local setting should not impact the local and
" global settings " global settings.
split split
setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:# setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
let cmd = 'setlocal listchars=tab:{.},lead:-,space:=,trail:#,eol:$,x' 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('$'))) call assert_equal(['+------+^^one>>two<<%'], ScreenLines(1, virtcol('$')))
" Setting invalid value for a global setting should not impact the local and " Setting invalid value for a global setting should not impact the local and
" global settings " global settings.
split split
setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:# setlocal listchars=tab:<->,lead:_,space:.,trail:@,eol:#
let cmd = 'setglobal listchars=tab:{.},lead:-,space:=,trail:#,eol:$,x' let cmd = 'setglobal listchars=tab:{.},lead:-,space:=,trail:#,eol:$,x'
@@ -494,6 +494,12 @@ func Test_listchars_window_local()
close close
call assert_equal(['+------+^^one>>two<<%'], ScreenLines(1, virtcol('$'))) 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! %bw!
set list& listchars& set list& listchars&
endfunc endfunc

View File

@@ -757,6 +757,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
3572,
/**/ /**/
3571, 3571,
/**/ /**/

View File

@@ -5041,6 +5041,8 @@ win_free(
clear_winopt(&wp->w_onebuf_opt); clear_winopt(&wp->w_onebuf_opt);
clear_winopt(&wp->w_allbuf_opt); clear_winopt(&wp->w_allbuf_opt);
vim_free(wp->w_lcs_chars.multispace);
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
vars_clear(&wp->w_vars->dv_hashtab); // free all w: variables vars_clear(&wp->w_vars->dv_hashtab); // free all w: variables
hash_init(&wp->w_vars->dv_hashtab); hash_init(&wp->w_vars->dv_hashtab);