commit b66f395ff444643852e3539b849267658e885bf4
parent 4e25b1a675976ed238752d547dc05aaaef38af29
Author: zeertzjq <zeertzjq@outlook.com>
Date: Wed, 24 Apr 2024 19:54:02 +0800
vim-patch:8.2.4974: ":so" command may read after end of buffer
Problem: ":so" command may read after end of buffer.
Solution: Compute length of text properly.
https://github.com/vim/vim/commit/4748c4bd64610cf943a431d215bb1aad51f8d0b4
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Diffstat:
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/src/nvim/runtime.c b/src/nvim/runtime.c
@@ -2726,6 +2726,7 @@ static char *get_one_sourceline(source_cookie_T *sp)
ga_grow(&ga, 1);
buf = (char *)ga.ga_data;
buf[ga.ga_len++] = NUL;
+ len = ga.ga_len;
} else {
buf = ga.ga_data;
retry:
@@ -2736,8 +2737,8 @@ retry:
}
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/test/old/testdir/test_source.vim b/test/old/testdir/test_source.vim
@@ -644,6 +644,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