diff --git a/src/Symfony/Component/Yaml/Inline.php b/src/Symfony/Component/Yaml/Inline.php index 4c7d37428e474..341482746ec57 100644 --- a/src/Symfony/Component/Yaml/Inline.php +++ b/src/Symfony/Component/Yaml/Inline.php @@ -759,15 +759,21 @@ private static function evaluateScalar($scalar, $flags, $references = []) switch (true) { case ctype_digit($scalar): - $raw = $scalar; + if ('0' === $scalar[0]) { + return octdec(preg_replace('/[^0-7]/', '', $scalar)); + } + $cast = (int) $scalar; - return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw); + return ($scalar === (string) $cast) ? $cast : $scalar; case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)): - $raw = $scalar; + if ('0' === $scalar[1]) { + return -octdec(preg_replace('/[^0-7]/', '', substr($scalar, 1))); + } + $cast = (int) $scalar; - return '0' == $scalar[1] ? -octdec(substr($scalar, 1)) : (($raw === (string) $cast) ? $cast : $raw); + return ($scalar === (string) $cast) ? $cast : $scalar; case is_numeric($scalar): case Parser::preg_match(self::getHexRegex(), $scalar): $scalar = str_replace('_', '', $scalar); diff --git a/src/Symfony/Component/Yaml/Tests/InlineTest.php b/src/Symfony/Component/Yaml/Tests/InlineTest.php index b28d472b334b6..0c6d509381fed 100644 --- a/src/Symfony/Component/Yaml/Tests/InlineTest.php +++ b/src/Symfony/Component/Yaml/Tests/InlineTest.php @@ -842,4 +842,14 @@ public function phpConstTagWithEmptyValueProvider() [['' => 'foo', 'bar' => 'ccc'], '{!php/const : foo, bar: ccc}'], ]; } + + public function testParsePositiveOctalNumberContainingInvalidDigits() + { + self::assertSame(342391, Inline::parse('0123456789')); + } + + public function testParseNegativeOctalNumberContainingInvalidDigits() + { + self::assertSame(-342391, Inline::parse('-0123456789')); + } }
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: