summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-06-15 22:39:11 +0200
committerBram Moolenaar <Bram@vim.org>2021-06-15 22:39:11 +0200
commita97c36310f90ed15dbf5a2ba5bf91fc906e2e724 (patch)
treedde2b162d72a2925f7cc90863a9bd324a55b0b36
parentf57b43c230c23117650c956c1f62546a34500fb6 (diff)
downloadvim-git-a97c36310f90ed15dbf5a2ba5bf91fc906e2e724.tar.gz
patch 8.2.3006: crash when echoing a value very earlyv8.2.3006
Problem: Crash when echoing a value very early. (Naruhiko Nishino) Solution: Do not use a NUL to truncate the message, make a copy. (closes #8388)
-rw-r--r--src/message.c20
-rw-r--r--src/testdir/test_startup.vim14
-rw-r--r--src/version.c2
3 files changed, 27 insertions, 9 deletions
diff --git a/src/message.c b/src/message.c
index f2fe23b58..cb713d721 100644
--- a/src/message.c
+++ b/src/message.c
@@ -2751,19 +2751,21 @@ msg_puts_printf(char_u *str, int maxlen)
if (*p != NUL && !(silent_mode && p_verbose == 0))
{
- int c = -1;
+ char_u *tofree = NULL;
if (maxlen > 0 && STRLEN(p) > (size_t)maxlen)
{
- c = p[maxlen];
- p[maxlen] = 0;
+ tofree = vim_strnsave(p, (size_t)maxlen);
+ p = tofree;
+ }
+ if (p != NULL)
+ {
+ if (info_message)
+ mch_msg((char *)p);
+ else
+ mch_errmsg((char *)p);
+ vim_free(tofree);
}
- if (info_message)
- mch_msg((char *)p);
- else
- mch_errmsg((char *)p);
- if (c != -1)
- p[maxlen] = c;
}
msg_didout = TRUE; // assume that line is not empty
diff --git a/src/testdir/test_startup.vim b/src/testdir/test_startup.vim
index 3cb5a2deb..c65b18cc2 100644
--- a/src/testdir/test_startup.vim
+++ b/src/testdir/test_startup.vim
@@ -1301,4 +1301,18 @@ func Test_write_in_vimrc()
call delete('Xvimrc')
endfunc
+func Test_echo_true_in_cmd()
+ let lines =<< trim END
+ echo v:true
+ call writefile(['done'], 'Xresult')
+ END
+ call writefile(lines, 'Xscript')
+ if RunVim([], [], '--cmd "source Xscript" --c q')
+ call assert_equal(['done'], readfile('Xresult'))
+ endif
+ call delete('Xscript')
+ call delete('Xresult')
+
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 21f5b5373..caba20ae3 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3006,
+/**/
3005,
/**/
3004,