فهرست منبع

Fixed json encoding when quoted value contained trailing backslash.

Condition checking if current character is inside a quoted string did not consider the case when backslash before quote is escaped with another backslash.
Jakub Zalas 13 سال پیش
والد
کامیت
c680ec7e51
2فایلهای تغییر یافته به همراه10 افزوده شده و 1 حذف شده
  1. 1 1
      src/Composer/Json/JsonFile.php
  2. 9 0
      tests/Composer/Test/Json/JsonFileTest.php

+ 1 - 1
src/Composer/Json/JsonFile.php

@@ -130,7 +130,7 @@ class JsonFile
             $char = substr($json, $i, 1);
 
             // Are we inside a quoted string?
-            if ('"' === $char && '\\' !== $prevChar) {
+            if ('"' === $char && ('\\' !== $prevChar || '\\\\' == substr($json, $i-2, 2))) {
                 $outOfQuotes = !$outOfQuotes;
             } elseif (':' === $char && $outOfQuotes) {
                 // Add a space after the : character

+ 9 - 0
tests/Composer/Test/Json/JsonFileTest.php

@@ -93,6 +93,15 @@ class JsonFileTest extends \PHPUnit_Framework_TestCase
         $this->assertJsonFormat($json, $data);
     }
 
+    public function testTrailingBackslash()
+    {
+        $data = array('Metadata\\' => 'src/');
+        $json = '{
+    "Metadata\\\\": "src\/"
+}';
+        $this->assertJsonFormat($json, $data);
+    }
+
     private function expectParseException($text, $json)
     {
         try {