From d72b877e45987b8869ceb6f86e126819b1bb3f41 Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Fri, 15 Mar 2019 13:17:58 +0100 Subject: [PATCH] Fix invalid memory access in preprocess_end when an error is thrown macro_stack might point to unwound local variables, we can't access them. --- tccpp.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tccpp.c b/tccpp.c index 4e60720..d309f13 100644 --- a/tccpp.c +++ b/tccpp.c @@ -3625,8 +3625,13 @@ ST_FUNC void preprocess_start(TCCState *s1, int is_asm) /* cleanup from error/setjmp */ ST_FUNC void preprocess_end(TCCState *s1) { - while (macro_stack) - end_macro(); + /* Normally macro_stack is NULL here, except if an + error was thrown; then it can point to allocated storage + or to some stack variables, but those are unwound via + setjmp already, so can't be accessed. Only two choices: + either we leak memory or we access invalid memory. The + former is the better choice. */ + macro_stack = NULL; macro_ptr = NULL; }