Skip to content

[Config] beforeNormalization with thenUnset leads to unhandled exception #29142

Closed
@edefimov

Description

@edefimov

Symfony version(s) affected: 4.1.7 (actually all versions)

Description
Suppose we have an implementation of Symfony\Component\Config\Definition\ConfigurationInterface. If we define beforeNormalization part for some node definition and call thenUnset as a result of if part, the application will crash with Symfony\Component\Config\Definition\Exception\UnsetKeyException.

How to reproduce

<?php

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\Processor;

require_once 'vendor/autoload.php';

$configuration = new class implements ConfigurationInterface {
    public function getConfigTreeBuilder()
    {
        $builder = new TreeBuilder();
        $root = $builder->root('root');
        $root
            ->children()
                ->scalarNode('value')
                ->beforeNormalization()
                    ->ifEmpty()
                    ->thenUnset()
                ->end()
            ->end();

        return $builder;
    }
};

$config = (new Processor())->processConfiguration($configuration, [['value' => null]]);

The output:

 Fatal error: Uncaught Symfony\Component\Config\Definition\Exception\UnsetKeyException: Unsetting key in vendor/symfony/symfony/src/Symfony/Component/Config/Definition/Builder/ExprBuilder.php on line 203

Symfony\Component\Config\Definition\Exception\UnsetKeyException: Unsetting key in vendor/symfony/symfony/src/Symfony/Component/Config/Definition/Builder/ExprBuilder.php on line 203

Call Stack:
    0.0002     402960   1. {main}() reproduce.php:0
    0.0022     715928   2. Symfony\Component\Config\Definition\Processor->processConfiguration() reproduce.php:27
    0.0053    1086056   3. Symfony\Component\Config\Definition\Processor->process() vendor/symfony/symfony/src/Symfony/Component/Config/Definition/Processor.php:52
    0.0053    1086056   4. Symfony\Component\Config\Definition\ArrayNode->normalize() vendor/symfony/symfony/src/Symfony/Component/Config/Definition/Processor.php:35
    0.0053    1086432   5. Symfony\Component\Config\Definition\ArrayNode->normalizeValue() vendor/symfony/symfony/src/Symfony/Component/Config/Definition/BaseNode.php:363
    0.0053    1086432   6. Symfony\Component\Config\Definition\ScalarNode->normalize() vendor/symfony/symfony/src/Symfony/Component/Config/Definition/ArrayNode.php:295
    0.0053    1086432   7. Symfony\Component\Config\Definition\Builder\ExprBuilder::Symfony\Component\Config\Definition\Builder\{closure}() vendor/symfony/symfony/src/Symfony/Component/Config/Definition/BaseNode.php:335
    0.0053    1086432   8. Symfony\Component\Config\Definition\Builder\ExprBuilder->Symfony\Component\Config\Definition\Builder\{closure}() vendor/symfony/symfony/src/Symfony/Component/Config/Definition/Builder/ExprBuilder.php:241

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions