[njs] Fixed parsing of hex, oct and binary literals with no digits.

Vadim Zhestikov v.zhestikov at f5.com
Mon Jan 29 16:59:32 UTC 2024


details:   https://hg.nginx.org/njs/rev/a2959e490279
branches:  
changeset: 2275:a2959e490279
user:      Vadim Zhestikov <v.zhestikov at f5.com>
date:      Mon Jan 29 08:57:49 2024 -0800
description:
Fixed parsing of hex, oct and binary literals with no digits.

diffstat:

 src/njs_lexer.c          |   6 +++---
 src/test/njs_unit_test.c |  15 ++++++++++++---
 2 files changed, 15 insertions(+), 6 deletions(-)

diffs (69 lines):

diff -r 08d7391230be -r a2959e490279 src/njs_lexer.c
--- a/src/njs_lexer.c	Mon Jan 29 08:57:48 2024 -0800
+++ b/src/njs_lexer.c	Mon Jan 29 08:57:49 2024 -0800
@@ -915,7 +915,7 @@ njs_lexer_number(njs_lexer_t *lexer, njs
         if (*p == 'x' || *p == 'X') {
             p++;
 
-            if (p == lexer->end) {
+            if (p == lexer->end || njs_char_to_hex(*p) < 0) {
                 goto illegal_token;
             }
 
@@ -929,7 +929,7 @@ njs_lexer_number(njs_lexer_t *lexer, njs
         if (*p == 'o' || *p == 'O') {
             p++;
 
-            if (p == lexer->end) {
+            if (p == lexer->end || (u_char)(*p - '0') > 7) {
                 goto illegal_token;
             }
 
@@ -947,7 +947,7 @@ njs_lexer_number(njs_lexer_t *lexer, njs
         if (*p == 'b' || *p == 'B') {
             p++;
 
-            if (p == lexer->end) {
+            if (p == lexer->end || (u_char)(*p - '0') > 1) {
                 goto illegal_token;
             }
 
diff -r 08d7391230be -r a2959e490279 src/test/njs_unit_test.c
--- a/src/test/njs_unit_test.c	Mon Jan 29 08:57:48 2024 -0800
+++ b/src/test/njs_unit_test.c	Mon Jan 29 08:57:49 2024 -0800
@@ -353,7 +353,10 @@ static njs_unit_test_t  njs_test[] =
       njs_str("SyntaxError: Unexpected token \"0O778\" in 1") },
 
     { njs_str("0O_7"),
-      njs_str("SyntaxError: Unexpected token \"_7\" in 1") },
+      njs_str("SyntaxError: Unexpected token \"0O\" in 1") },
+
+    { njs_str("0O + 1"),
+      njs_str("SyntaxError: Unexpected token \"0O\" in 1") },
 
     { njs_str("0o7_"),
       njs_str("SyntaxError: Unexpected token \"_\" in 1") },
@@ -408,7 +411,10 @@ static njs_unit_test_t  njs_test[] =
       njs_str("SyntaxError: Unexpected token \"0B12\" in 1") },
 
     { njs_str("0b_11"),
-      njs_str("SyntaxError: Unexpected token \"_11\" in 1") },
+      njs_str("SyntaxError: Unexpected token \"0b\" in 1") },
+
+    { njs_str("0b + 1"),
+      njs_str("SyntaxError: Unexpected token \"0b\" in 1") },
 
     { njs_str("0B1__1"),
       njs_str("SyntaxError: Unexpected token \"__1\" in 1") },
@@ -446,7 +452,10 @@ static njs_unit_test_t  njs_test[] =
       njs_str("SyntaxError: Unexpected token \"g\" in 1") },
 
     { njs_str("0X_ff"),
-      njs_str("SyntaxError: Unexpected token \"_ff\" in 1") },
+      njs_str("SyntaxError: Unexpected token \"0X\" in 1") },
+
+    { njs_str("0X + 1"),
+      njs_str("SyntaxError: Unexpected token \"0X\" in 1") },
 
     { njs_str("0xff_"),
       njs_str("SyntaxError: Unexpected token \"_\" in 1") },


More information about the nginx-devel mailing list