From d68a0044858d00de6100def1e389a3a9c1cdbcdc Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 20 Oct 2021 23:08:11 +0100 Subject: patch 8.2.3548: GTK GUI crashen when reading from stdin Problem: GTK GUI crashen when reading from stdin. Solution: Do not overwrite the NUL after the string. (closes #9028) --- src/gui_gtk_x11.c | 12 ++++++++---- src/testdir/test_gui.vim | 22 ++++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 32 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index e107c5e060..d46f819073 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -5744,12 +5744,16 @@ gui_gtk2_draw_string(int row, int col, char_u *s, int len, int flags) } } - // temporarily zero terminate substring, print, restore char, wrap - backup_ch = *(cs + slen); - *(cs + slen) = 0; + if (slen < len) + { + // temporarily zero terminate substring, print, restore char, wrap + backup_ch = *(cs + slen); + *(cs + slen) = NUL; + } len_sum += gui_gtk2_draw_string_ext(row, col + len_sum, cs, slen, flags, needs_pango); - *(cs + slen) = backup_ch; + if (slen < len) + *(cs + slen) = backup_ch; cs += slen; byte_sum += slen; needs_pango = should_need_pango; diff --git a/src/testdir/test_gui.vim b/src/testdir/test_gui.vim index 84836e6692..133298db3a 100644 --- a/src/testdir/test_gui.vim +++ b/src/testdir/test_gui.vim @@ -145,6 +145,28 @@ func Test_quoteplus() let @+ = quoteplus_saved endfunc +func Test_gui_read_stdin() + CheckUnix + + call writefile(['some', 'lines'], 'Xstdin') + let script =<< trim END + call writefile(getline(1, '$'), 'XstdinOK') + qa! + END + call writefile(script, 'Xscript') + + " Cannot use --not-a-term here, the "reading from stdin" message would not be + " displayed. + let vimcmd = substitute(GetVimCommand(), '--not-a-term', '', '') + + call system('cat Xstdin | ' .. vimcmd .. ' -f -g -S Xscript -') + call assert_equal(['some', 'lines'], readfile('XstdinOK')) + + call delete('Xstdin') + call delete('XstdinOK') + call delete('Xscript') +endfunc + func Test_set_background() let background_saved = &background diff --git a/src/version.c b/src/version.c index 3f80877da9..1e7fb75cab 100644 --- a/src/version.c +++ b/src/version.c @@ -757,6 +757,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 3548, /**/ 3547, /**/ -- cgit v1.2.3