From 846389dd665a3b69b2ff88cab282d48c0209bbb1 Mon Sep 17 00:00:00 2001 From: Alexander Borisov Date: Mon, 17 May 2021 20:35:35 +0300 Subject: [PATCH] Fixed parsing case/default in an unclosed function block in switch. --- src/njs_parser.c | 13 ++++++++++++- src/test/njs_unit_test.c | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/njs_parser.c b/src/njs_parser.c index aaa99b63..aef1ffe8 100644 --- a/src/njs_parser.c +++ b/src/njs_parser.c @@ -4713,7 +4713,10 @@ njs_parser_statement_list_next(njs_parser_t *parser, njs_lexer_token_t *token, if (parser->ret != NJS_OK) { if (token->type != NJS_TOKEN_CLOSE_BRACE) { parser->node = parser->target; - return njs_parser_stack_pop(parser); + + (void) njs_parser_stack_pop(parser); + + return parser->ret; } return njs_parser_failed(parser); @@ -6098,6 +6101,10 @@ njs_parser_switch_case_block(njs_parser_t *parser, njs_lexer_token_t *token, { parser->target->right->right = parser->node; + if (parser->ret != NJS_OK && parser->target->scope != parser->scope) { + return njs_parser_failed(parser); + } + njs_parser_next(parser, njs_parser_switch_case); return NJS_OK; @@ -6153,6 +6160,10 @@ njs_parser_switch_case_block_wo_def(njs_parser_t *parser, parser->target->right = parser->node; } + if (parser->ret != NJS_OK && parser->target->scope != parser->scope) { + return njs_parser_failed(parser); + } + njs_parser_next(parser, njs_parser_switch_case_wo_def); return NJS_OK; diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index d003da77..529eea7e 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -2958,6 +2958,24 @@ static njs_unit_test_t njs_test[] = "map((v)=>{switch(v) { case isNaN: return 1; default: return 0;}})"), njs_str("1,0,0") }, + { njs_str("switch (1) {case 1: ii > 1; ii => default:}"), + njs_str("SyntaxError: Unexpected token \"default\" in 1") }, + + { njs_str("switch (1) {case 1: ii > 1; var a = functin () {default:}"), + njs_str("SyntaxError: Unexpected token \"{\" in 1") }, + + { njs_str("switch (1) {default: ii > 1; ii => case 2:}"), + njs_str("SyntaxError: Unexpected token \"case\" in 1") }, + + { njs_str("switch (1) {default: ii > 1; var a = functin () {case 2:}"), + njs_str("SyntaxError: Unexpected token \"{\" in 1") }, + + { njs_str("switch (1) {case 1: ii > 1; ii => case 2:}"), + njs_str("SyntaxError: Unexpected token \"case\" in 1") }, + + { njs_str("switch (1) {case 1: ii > 1; var a = functin () {case 2:}"), + njs_str("SyntaxError: Unexpected token \"{\" in 1") }, + /* continue. */ { njs_str("continue"), -- 2.47.3