summaryrefslogtreecommitdiffhomepage
path: root/compiler.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2022-02-11 23:44:29 +0100
committerJo-Philipp Wich <jo@mein.io>2022-02-11 23:46:26 +0100
commita29bad9454edcc285f7f37410b6822affede44d1 (patch)
tree1f0f2255cc64bfcc84efeab0ed5ae07f4f589b24 /compiler.c
parent86f0662f891ac83f474a412b4271af996f1ea44e (diff)
compiler: fix patchlist corruption on switch statement syntax errors
When compiling a switch statement with duplicate `default` cases or a switch statement with syntax errors before the body block, two error handling cases were hit in the code that prematurely returned from the function without resetting the compiler's patchlist pointer away from the on-stack patchlist that had been set up for the switch statement. Upon processing a subsequent break or continue control statement, a realloc was performed on the then invalid patchlist contents, triggering a segmentation fault or libc assert. Solve this issue by not returning from the function but breaking the switch body parsing loop. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'compiler.c')
-rw-r--r--compiler.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/compiler.c b/compiler.c
index f69ee2d..00f9f11 100644
--- a/compiler.c
+++ b/compiler.c
@@ -2448,7 +2448,7 @@ uc_compiler_compile_switch(uc_compiler_t *compiler)
uc_compiler_syntax_error(compiler, compiler->parser->prev.pos,
"more than one switch default case");
- return;
+ break;
}
uc_compiler_parse_consume(compiler, TK_COLON);
@@ -2511,7 +2511,7 @@ uc_compiler_compile_switch(uc_compiler_t *compiler)
uc_compiler_syntax_error(compiler, compiler->parser->curr.pos,
"Expecting 'case' or 'default'");
- return;
+ break;
}
}