Mercurial > vim
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; } /*