Parcourir la source

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 il y a 13 ans
Parent
commit
c680ec7e51
2 fichiers modifiés avec 10 ajouts et 1 suppressions
  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 {