]> git.kaiwu.me - njs.git/commitdiff
Comprehensive test of "return" statement location.
authorIgor Sysoev <igor@sysoev.ru>
Mon, 16 Jan 2017 14:32:10 +0000 (17:32 +0300)
committerIgor Sysoev <igor@sysoev.ru>
Mon, 16 Jan 2017 14:32:10 +0000 (17:32 +0300)
Found with afl-fuzz.

njs/njs_parser.c
njs/test/njs_unit_test.c

index 5891f417a3a46d9570dbd9eb9a8af9ab63242806..4fdbb173f00292cda9fb92034e29d4c274f7c576 100644 (file)
@@ -697,14 +697,20 @@ njs_parser_function_lambda(njs_vm_t *vm, njs_function_lambda_t *lambda,
 static njs_token_t
 njs_parser_return_statement(njs_vm_t *vm, njs_parser_t *parser)
 {
-    njs_token_t        token;
-    njs_parser_node_t  *node;
+    njs_token_t         token;
+    njs_parser_node_t   *node;
+    njs_parser_scope_t  *scope;
 
-    if (parser->scope->type == NJS_SCOPE_GLOBAL) {
-        nxt_alert(&vm->trace, NXT_LEVEL_ERROR,
-                  "SyntaxError: Illegal return statement");
+    for (scope = parser->scope;
+         scope->type != NJS_SCOPE_FUNCTION;
+         scope = scope->parent)
+    {
+        if (scope->type == NJS_SCOPE_GLOBAL) {
+            nxt_alert(&vm->trace, NXT_LEVEL_ERROR,
+                      "SyntaxError: Illegal return statement");
 
-        return NXT_ERROR;
+            return NXT_ERROR;
+        }
     }
 
     node = njs_parser_node_alloc(vm);
index 95363aee7eeda82524e6b7b2c702a8376de24c79..f8e0471c73408320edf5791fd40bd453297b352f 100644 (file)
@@ -3976,6 +3976,9 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("return"),
       nxt_string("SyntaxError: Illegal return statement in 1") },
 
+    { nxt_string("{return}"),
+      nxt_string("SyntaxError: Illegal return statement in 1") },
+
     { nxt_string("function f() { return f() } f()"),
       nxt_string("RangeError: Maximum call stack size exceeded") },