summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-05-17 17:47:07 +0100
committerBram Moolenaar <Bram@vim.org>2022-05-17 17:47:07 +0100
commit4748c4bd64610cf943a431d215bb1aad51f8d0b4 (patch)
treea5e483daee891807be23aac8be24587a8da4b26f
parentbd3a9d2c946bae0427d7c9b9249716064935fb4e (diff)
patch 8.2.4974: ":so" command may read after end of bufferv8.2.4974
Problem: ":so" command may read after end of buffer. Solution: Compute length of text properly.
-rw-r--r--src/scriptfile.c3
-rw-r--r--src/testdir/test_source.vim11
-rw-r--r--src/version.c2
3 files changed, 15 insertions, 1 deletions
diff --git a/src/scriptfile.c b/src/scriptfile.c
index 03c733d354..f3a5783db5 100644
--- a/src/scriptfile.c
+++ b/src/scriptfile.c
@@ -1965,6 +1965,7 @@ get_one_sourceline(source_cookie_T *sp)
break;
buf = (char_u *)ga.ga_data;
buf[ga.ga_len++] = NUL;
+ len = ga.ga_len;
}
else
{
@@ -1972,8 +1973,8 @@ get_one_sourceline(source_cookie_T *sp)
if (fgets((char *)buf + ga.ga_len, ga.ga_maxlen - ga.ga_len,
sp->fp) == NULL)
break;
+ len = ga.ga_len + (int)STRLEN(buf + ga.ga_len);
}
- len = ga.ga_len + (int)STRLEN(buf + ga.ga_len);
#ifdef USE_CRNL
// Ignore a trailing CTRL-Z, when in Dos mode. Only recognize the
// CTRL-Z by its own, or after a NL.
diff --git a/src/testdir/test_source.vim b/src/testdir/test_source.vim
index 5f45ab413c..4736e93546 100644
--- a/src/testdir/test_source.vim
+++ b/src/testdir/test_source.vim
@@ -652,6 +652,17 @@ func Test_source_buffer_long_line()
norm300gr0
so
bwipe!
+
+ let lines =<< trim END
+ new
+ norm 10a0000000000ΓΈ00000000000
+ norm i0000000000000000000
+ silent! so
+ END
+ call writefile(lines, 'Xtest.vim')
+ source Xtest.vim
+ bwipe!
+ call delete('Xtest.vim')
endfunc
diff --git a/src/version.c b/src/version.c
index 68d11a2b0f..98bb40d116 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4974,
+/**/
4973,
/**/
4972,