Bläddra i källkod

Fix JsonParser not able to parse "\u0000" (#1160)

Genteure 3 år sedan
förälder
incheckning
7276b49e7e
2 ändrade filer med 26 tillägg och 13 borttagningar
  1. 22 0
      Jint.Tests/Runtime/JsonTests.cs
  2. 4 13
      Jint/Native/Json/JsonParser.cs

+ 22 - 0
Jint.Tests/Runtime/JsonTests.cs

@@ -15,6 +15,28 @@ namespace Jint.Tests.Runtime
              Assert.True(obj.HasOwnProperty("abc\tdef"));
         }
 
+        [Theory]
+        [InlineData("{\"a\":\"\\\"\"}", "\"")] // " quotation mark
+        [InlineData("{\"a\":\"\\\\\"}", "\\")] // \ reverse solidus
+        [InlineData("{\"a\":\"\\/\"}", "/")] // / solidus
+        [InlineData("{\"a\":\"\\b\"}", "\b")] // backspace
+        [InlineData("{\"a\":\"\\f\"}", "\f")] // formfeed
+        [InlineData("{\"a\":\"\\n\"}", "\n")] // linefeed
+        [InlineData("{\"a\":\"\\r\"}", "\r")] // carriage return
+        [InlineData("{\"a\":\"\\t\"}", "\t")] // horizontal tab
+        [InlineData("{\"a\":\"\\u0000\"}", "\0")]
+        [InlineData("{\"a\":\"\\u0001\"}", "\x01")]
+        [InlineData("{\"a\":\"\\u0061\"}", "a")]
+        public void ShouldParseEscapedCharactersCorrectly(string json, string expectedCharacter)
+        {
+            var engine = new Engine();
+            var parser = new JsonParser(engine);
+
+            var parsedCharacter = parser.Parse(json).AsObject().Get("a").AsString();
+
+            Assert.Equal(expectedCharacter, parsedCharacter);
+        }
+
         [Theory]
         [InlineData("{\"a\":1", "Unexpected end of JSON input at position 6")]
         [InlineData("{\"a\":1},", "Unexpected token ',' in JSON at position 7")]

+ 4 - 13
Jint/Native/Json/JsonParser.cs

@@ -335,26 +335,17 @@ namespace Jint.Native.Json
                                 break;
                             case 'u':
                             case 'x':
-                                int restore = _index;
                                 char unescaped = ScanHexEscape(ch);
-                                if (unescaped > 0)
-                                {
-                                    sb.Append(unescaped.ToString());
-                                }
-                                else
-                                {
-                                    _index = restore;
-                                    sb.Append(ch.ToString());
-                                }
+                                sb.Append(unescaped);
                                 break;
                             case 'b':
-                                sb.Append("\b");
+                                sb.Append('\b');
                                 break;
                             case 'f':
-                                sb.Append("\f");
+                                sb.Append('\f');
                                 break;
                             case 'v':
-                                sb.Append("\x0B");
+                                sb.Append('\x0B');
                                 break;
 
                             default: