[njs] Fixed parsing semicolons.

Igor Sysoev igor at sysoev.ru
Mon Jan 16 12:00:54 UTC 2017


details:   http://hg.nginx.org/njs/rev/07dc20c1206d
branches:  
changeset: 300:07dc20c1206d
user:      Igor Sysoev <igor at sysoev.ru>
date:      Mon Jan 16 14:51:29 2017 +0300
description:
Fixed parsing semicolons.

Found with AddressSanitizer.

diffstat:

 njs/njs_parser.c |  26 ++++++++++++++++++--------
 1 files changed, 18 insertions(+), 8 deletions(-)

diffs (76 lines):

diff -r e4f695e81689 -r 07dc20c1206d njs/njs_parser.c
--- a/njs/njs_parser.c	Thu Jan 05 15:55:52 2017 +0300
+++ b/njs/njs_parser.c	Mon Jan 16 14:51:29 2017 +0300
@@ -229,11 +229,9 @@ njs_parser_statement_chain(njs_vm_t *vm,
 
     if (nxt_fast_path(token > NJS_TOKEN_ILLEGAL)) {
 
-        if (parser->node != last) {
-            /*
-             * The statement is not empty block, not just semicolon,
-             * and not variables declaration without initialization.
-             */
+        if (parser->node != NULL) {
+            /* The statement is not empty block or just semicolon. */
+
             node = njs_parser_node_alloc(vm);
             if (nxt_slow_path(node == NULL)) {
                 return NJS_TOKEN_ERROR;
@@ -243,6 +241,15 @@ njs_parser_statement_chain(njs_vm_t *vm,
             node->left = last;
             node->right = parser->node;
             parser->node = node;
+
+            while (token == NJS_TOKEN_SEMICOLON
+                   || token == NJS_TOKEN_LINE_END)
+            {
+                token = njs_parser_token(parser);
+                if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
+                    break;
+                }
+            }
         }
 
     } else if (vm->exception == NULL) {
@@ -257,6 +264,8 @@ static njs_token_t
 njs_parser_statement(njs_vm_t *vm, njs_parser_t *parser,
     njs_token_t token)
 {
+    parser->node = NULL;
+
     switch (token) {
 
     case NJS_TOKEN_FUNCTION:
@@ -296,7 +305,6 @@ njs_parser_statement(njs_vm_t *vm, njs_p
         return njs_parser_throw_statement(vm, parser);
 
     case NJS_TOKEN_SEMICOLON:
-        parser->node = NULL;
         return njs_parser_token(parser);
 
     case NJS_TOKEN_OPEN_BRACE:
@@ -348,13 +356,13 @@ njs_parser_block_statement(njs_vm_t *vm,
         return token;
     }
 
-    parser->node = NULL;
-
     ret = njs_parser_scope_begin(vm, parser, NJS_SCOPE_BLOCK);
     if (nxt_slow_path(ret != NXT_OK)) {
         return NJS_TOKEN_ERROR;
     }
 
+    parser->node = NULL;
+
     while (token != NJS_TOKEN_CLOSE_BRACE) {
         token = njs_parser_statement_chain(vm, parser, token);
         if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
@@ -836,6 +844,8 @@ njs_parser_var_statement(njs_vm_t *vm, n
     switch (token) {
 
     case NJS_TOKEN_SEMICOLON:
+        return njs_parser_token(parser);
+
     case NJS_TOKEN_CLOSE_BRACE:
     case NJS_TOKEN_END:
         return token;


More information about the nginx-devel mailing list