diff --git a/src/charset.c b/src/charset.c index 31b03eb38a15a..d762a2545bf0a 100644 --- a/src/charset.c +++ b/src/charset.c @@ -1240,10 +1240,15 @@ getvcol( posptr = NULL; // continue until the NUL else { - // Special check for an empty line, which can happen on exit, when - // ml_get_buf() always returns an empty string. - if (*ptr == NUL) - pos->col = 0; + colnr_T i; + + // In a few cases the position can be beyond the end of the line. + for (i = 0; i < pos->col; ++i) + if (ptr[i] == NUL) + { + pos->col = i; + break; + } posptr = ptr + pos->col; if (has_mbyte) // always start on the first byte diff --git a/src/testdir/test_regexp_latin.vim b/src/testdir/test_regexp_latin.vim index 03efdbea30e63..f936549e7aab8 100644 --- a/src/testdir/test_regexp_latin.vim +++ b/src/testdir/test_regexp_latin.vim @@ -1053,4 +1053,12 @@ func Test_using_visual_position() bwipe! endfunc +func Test_using_invalid_visual_position() + " this was going beyond the end of the line + new + exe "norm 0o000\0\$s0" + /\%V + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 9f5ed308a1f25..56d900dc2c067 100644 --- a/src/version.c +++ b/src/version.c @@ -749,6 +749,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 3950, /**/ 3949, /**/