changeset 24938:ac0211a9fb6a v8.2.3006

patch 8.2.3006: crash when echoing a value very early Commit: https://github.com/vim/vim/commit/a97c36310f90ed15dbf5a2ba5bf91fc906e2e724 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Jun 15 22:39:11 2021 +0200 patch 8.2.3006: crash when echoing a value very early 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)
author Bram Moolenaar <Bram@vim.org>
date Tue, 15 Jun 2021 22:45:04 +0200
parents a9c25ee5404b
children 257de87388c3
files src/message.c src/testdir/test_startup.vim src/version.c
diffstat 3 files changed, 27 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- 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 (info_message)
-	    mch_msg((char *)p);
-	else
-	    mch_errmsg((char *)p);
-	if (c != -1)
-	    p[maxlen] = c;
+	if (p != NULL)
+	{
+	    if (info_message)
+		mch_msg((char *)p);
+	    else
+		mch_errmsg((char *)p);
+	    vim_free(tofree);
+	}
     }
 
     msg_didout = TRUE;	    // assume that line is not empty
--- 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
--- 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,