changeset 26288:8e0cbe0d84ec v8.2.3675

patch 8.2.3675: using freed memory when vim_strsave() fails Commit: https://github.com/vim/vim/commit/ba8c92687d53c91bbc20c867a49e0988819ea2d5 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Nov 25 14:43:18 2021 +0000 patch 8.2.3675: using freed memory when vim_strsave() fails Problem: Using freed memory when vim_strsave() fails. Solution: Clear "last_sourcing_name". Check for msg_source() called recursively. (closes #8217)
author Bram Moolenaar <Bram@vim.org>
date Thu, 25 Nov 2021 15:45:04 +0100
parents 6c01cf7bd288
children 526c3e72d98f
files src/message.c src/version.c
diffstat 2 files changed, 12 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/message.c
+++ b/src/message.c
@@ -522,6 +522,12 @@ get_emsg_lnum(void)
 msg_source(int attr)
 {
     char_u	*p;
+    static int	recursive = FALSE;
+
+    // Bail out if something called here causes an error.
+    if (recursive)
+	return;
+    recursive = TRUE;
 
     ++no_wait_return;
     p = get_emsg_source();
@@ -541,13 +547,13 @@ msg_source(int attr)
     // remember the last sourcing name printed, also when it's empty
     if (SOURCING_NAME == NULL || other_sourcing_name())
     {
-	vim_free(last_sourcing_name);
-	if (SOURCING_NAME == NULL)
-	    last_sourcing_name = NULL;
-	else
+	VIM_CLEAR(last_sourcing_name);
+	if (SOURCING_NAME != NULL)
 	    last_sourcing_name = vim_strsave(SOURCING_NAME);
     }
     --no_wait_return;
+
+    recursive = FALSE;
 }
 
 /*
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3675,
+/**/
     3674,
 /**/
     3673,