From 6e28703a8e41f775f64e442c5d11ce1ff599aa3f Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sat, 12 Feb 2022 15:42:18 +0000 Subject: [PATCH] patch 8.2.4359: crash when repeatedly using :retab Problem: crash when repeatedly using :retab. Solution: Bail out when the line is getting too long. --- src/indent.c | 5 +++++ src/testdir/test_retab.vim | 19 +++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 26 insertions(+) diff --git a/src/indent.c b/src/indent.c index 9b137b0b4..232c53497 100644 --- a/src/indent.c +++ b/src/indent.c @@ -1750,6 +1750,11 @@ ex_retab(exarg_T *eap) if (ptr[col] == NUL) break; vcol += chartabsize(ptr + col, (colnr_T)vcol); + if (vcol >= MAXCOL) + { + emsg(_(e_resulting_text_too_long)); + break; + } if (has_mbyte) col += (*mb_ptr2len)(ptr + col); else diff --git a/src/testdir/test_retab.vim b/src/testdir/test_retab.vim index c7190aaa6..6133e8fb4 100644 --- a/src/testdir/test_retab.vim +++ b/src/testdir/test_retab.vim @@ -70,6 +70,8 @@ func Test_retab() call assert_equal(" a b c ", Retab('!', 3)) call assert_equal(" a b c ", Retab('', 5)) call assert_equal(" a b c ", Retab('!', 5)) + + set tabstop& expandtab& endfunc func Test_retab_error() @@ -80,4 +82,21 @@ func Test_retab_error() call assert_fails('ret 80000000000000000000', 'E475:') endfunc +func Test_retab_endless() + new + call setline(1, "\t0\t") + let caught = 'no' + try + while 1 + set ts=4000 + retab 4 + endwhile + catch /E1240/ + let caught = 'yes' + endtry + bwipe! + set tabstop& +endfunc + + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 636757c3b..aaafadf89 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4359, /**/ 4358, /**/ -- 2.40.0