Fix: Prevent infinite loop from circular extends in config #5303
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #5096 - Resolves infinite loop when a config section extends itself (directly or indirectly).
Problem
Previously, the
walk_optionsmethod inplatformio/project/config.pydid not check for circular dependencies when processingextendsdirectives. This caused infinite loops in cases like:or more complex chains:
Solution
Added cycle detection by checking if a section is already in
extends_doneorextends_queuebefore adding it to the processing queue. This prevents sections from being processed multiple times and breaks circular dependency chains.Changes
walk_optionsmethod inplatformio/project/config.py(lines 180-188)extends_queue.extend()to iterating and checking each section individuallyif ext_section not in extends_done and ext_section not in extends_queueTesting
Tested with both simple and complex circular reference cases:
[base] extends = base[common] extends = base+[base] extends = commonBoth cases now complete successfully without hanging, while still preserving valid config inheritance behavior.
🤖 Generated with Claude Code