From 396b7c78c0fd9cd07528963b18c27398491df40d Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 21 Oct 2019 23:08:59 +0200 Subject: patch 8.1.2198: crash when using :center in autocommand Problem: Crash when using :center in autocommand. Solution: Bail out early for an empty line. (Dominique pelle, closes #5095) --- src/ex_cmds.c | 13 +++++++++---- src/testdir/test_textformat.vim | 20 ++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 31 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/ex_cmds.c b/src/ex_cmds.c index bcff7ee71..e472c8a6f 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -251,18 +251,23 @@ linelen(int *has_tab) int save; int len; - /* find the first non-blank character */ + // Get the line. If it's empty bail out early (could be the empty string + // for an unloaded buffer). line = ml_get_curline(); + if (*line == NUL) + return 0; + + // find the first non-blank character first = skipwhite(line); - /* find the character after the last non-blank character */ + // find the character after the last non-blank character for (last = first + STRLEN(first); last > first && VIM_ISWHITE(last[-1]); --last) ; save = *last; *last = NUL; - len = linetabsize(line); /* get line length */ - if (has_tab != NULL) /* check for embedded TAB */ + len = linetabsize(line); // get line length + if (has_tab != NULL) // check for embedded TAB *has_tab = (vim_strchr(first, TAB) != NULL); *last = save; diff --git a/src/testdir/test_textformat.vim b/src/testdir/test_textformat.vim index 13fb50b98..3a0552b83 100644 --- a/src/testdir/test_textformat.vim +++ b/src/testdir/test_textformat.vim @@ -1,4 +1,7 @@ " Tests for the various 'formatoptions' settings + +source check.vim + func Test_text_format() enew! @@ -489,3 +492,20 @@ func Test_format_list_auto() bwipe! set fo& ai& bs& endfunc + +func Test_crash_github_issue_5095() + CheckFeature autocmd + + " This used to segfault, see https://github.com/vim/vim/issues/5095 + augroup testing + au BufNew x center + augroup END + + next! x + + bw + augroup testing + au! + augroup END + augroup! testing +endfunc diff --git a/src/version.c b/src/version.c index 549b7eea7..77e6e35be 100644 --- a/src/version.c +++ b/src/version.c @@ -741,6 +741,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2198, /**/ 2197, /**/ -- cgit v1.2.1