]> git.kaiwu.me - njs.git/commitdiff
Fixed comparison of Byte and UTF8 strings.
authorDmitry Volyntsev <xeioex@nginx.com>
Fri, 30 Nov 2018 14:52:02 +0000 (17:52 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Fri, 30 Nov 2018 14:52:02 +0000 (17:52 +0300)
njs/njs_vm.c
njs/test/njs_unit_test.c

index 760c51a4280a5ecc16a5023a36416306534f8650..56737b4cb8f7a47945f46576c14df6f891fc4ce1 100644 (file)
@@ -1712,7 +1712,7 @@ njs_vmcode_strict_not_equal(njs_vm_t *vm, njs_value_t *val1, njs_value_t *val2)
 nxt_noinline nxt_bool_t
 njs_values_strict_equal(const njs_value_t *val1, const njs_value_t *val2)
 {
-    size_t        size;
+    size_t        size, length1, length2;
     const u_char  *start1, *start2;
 
     if (val1->type != val2->type) {
@@ -1737,7 +1737,14 @@ njs_values_strict_equal(const njs_value_t *val1, const njs_value_t *val2)
         }
 
         if (size != NJS_STRING_LONG) {
-            if (val1->short_string.length != val2->short_string.length) {
+            length1 = val1->short_string.length;
+            length2 = val2->short_string.length;
+
+            /*
+             * Using full memcmp() comparison if at least one string
+             * is a Byte string.
+             */
+            if (length1 != 0 && length2 != 0 && length1 != length2) {
                 return 0;
             }
 
@@ -1751,9 +1758,14 @@ njs_values_strict_equal(const njs_value_t *val1, const njs_value_t *val2)
                 return 0;
             }
 
-            if (val1->long_string.data->length
-                != val2->long_string.data->length)
-            {
+            length1 = val1->long_string.data->length;
+            length2 = val2->long_string.data->length;
+
+            /*
+             * Using full memcmp() comparison if at least one string
+             * is a Byte string.
+             */
+            if (length1 != 0 && length2 != 0 && length1 != length2) {
                 return 0;
             }
 
index b6011a4ed2a9dce64bb2bf7ae89cbe8ab4e4e5d9..af1b1303a00f22e05904e3789f0c69e048aca548 100644 (file)
@@ -2337,6 +2337,16 @@ static njs_unit_test_t  njs_test[] =
                  "} a"),
       nxt_string("A123DT") },
 
+    { nxt_string("var t; "
+                 "switch ($r3.uri) {"
+                 "case 'abc': "
+                 "  t='A'; "
+                 "  break; "
+                 "default: "
+                 "  t='F'; "
+                 "}; t"),
+      nxt_string("A") },
+
     /* continue. */
 
     { nxt_string("continue"),
@@ -4045,7 +4055,7 @@ static njs_unit_test_t  njs_test[] =
       nxt_string("true") },
 
     { nxt_string("'\\u00CE\\u00B1'.toBytes() === 'α'"),
-      nxt_string("false") },
+      nxt_string("true") },
 
     { nxt_string("var b = '\\u00C2\\u00B6'.toBytes(), u = b.fromUTF8();"
                  "b.length +' '+ b +' '+ u.length +' '+ u"),
@@ -4087,6 +4097,12 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("var a = '\\xB5\\xA7\\xB1\\xAE'.toBytes(); a.fromBytes(1, 3)"),
       nxt_string("§±") },
 
+    { nxt_string("'A'.repeat(8).toBytes() === 'A'.repeat(8)"),
+      nxt_string("true") },
+
+    { nxt_string("'A'.repeat(16).toBytes() === 'A'.repeat(16)"),
+      nxt_string("true") },
+
     { nxt_string("var a = 'abcdefgh'; a.substr(3, 15)"),
       nxt_string("defgh") },
 
@@ -4476,6 +4492,9 @@ static njs_unit_test_t  njs_test[] =
     { nxt_string("var o = {b:$r.props.b}; o.b"),
       nxt_string("42") },
 
+    { nxt_string("$r2.uri == 'αβγ' && $r2.uri === 'αβγ'"),
+      nxt_string("true") },
+
     /**/
 
     { nxt_string("'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'.charCodeAt(5)"),