From 854e07b1de3cfeefcc5afa50dfa1588bd44d758f Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Wed, 3 Sep 2014 19:52:14 +0200 Subject: [PATCH] improve error when detecting unquoted asterisks Asterisks in unquoted strings are used in YAML to reference variables. Before Symfony 2.3.19, Symfony 2.4.9 and Symfony 2.5.4, unquoted asterisks in inlined YAML code were treated as regular strings. This was fixed for the inline parser in #11677. However, an unquoted * character now led to an error message like this: ``` PHP Warning: array_key_exists(): The first argument should be either a string or an integer in vendor/symfony/symfony/src/Symfony/Component/Yaml/Inline.php on line 409 [Symfony\Component\Yaml\Exception\ParseException] Reference "" does not exist at line 171 (near "- { foo: * }"). ``` --- src/Symfony/Component/Yaml/Inline.php | 7 ++++++- .../Component/Yaml/Tests/InlineTest.php | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Yaml/Inline.php b/src/Symfony/Component/Yaml/Inline.php index 1b34edebd2..fc00405a8b 100644 --- a/src/Symfony/Component/Yaml/Inline.php +++ b/src/Symfony/Component/Yaml/Inline.php @@ -392,7 +392,7 @@ class Inline * * @return string A YAML string * - * @throws ParseException when object parsing support was disabled and the parser detected a PHP object + * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved */ private static function evaluateScalar($scalar, $references = array()) { @@ -406,6 +406,11 @@ class Inline $value = substr($scalar, 1); } + // an unquoted * + if (false === $value || '' === $value) { + throw new ParseException('A reference must contain at least one character.'); + } + if (!array_key_exists($value, $references)) { throw new ParseException(sprintf('Reference "%s" does not exist.', $value)); } diff --git a/src/Symfony/Component/Yaml/Tests/InlineTest.php b/src/Symfony/Component/Yaml/Tests/InlineTest.php index 96a118d073..6b5da8df39 100644 --- a/src/Symfony/Component/Yaml/Tests/InlineTest.php +++ b/src/Symfony/Component/Yaml/Tests/InlineTest.php @@ -147,6 +147,24 @@ class InlineTest extends \PHPUnit_Framework_TestCase $this->assertSame(array($foo), Inline::parse('[*foo]', false, false, array('foo' => $foo))); } + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + * @expectedExceptionMessage A reference must contain at least one character. + */ + public function testParseUnquotedAsterisk() + { + Inline::parse('{ foo: * }'); + } + + /** + * @expectedException \Symfony\Component\Yaml\Exception\ParseException + * @expectedExceptionMessage A reference must contain at least one character. + */ + public function testParseUnquotedAsteriskFollowedByAComment() + { + Inline::parse('{ foo: * #foo }'); + } + protected function getTestsForParse() { return array(