Skip to content

Prevent stack overflow from cyclic key references - #410

Open
rupayon123 wants to merge 1 commit into
go-ini:mainfrom
rupayon123:contribution/resolve-reference-cycles-20260923
Open

rupayon123 wants to merge 1 commit into
go-ini:mainfrom
rupayon123:contribution/resolve-reference-cycles-20260923

Conversation

@rupayon123

Copy link
Copy Markdown

Reading mutually referencing keys can overflow the Go process stack (#409). Key.String() recursively calls another key's String() without tracking which keys are already on the current resolution path; the existing per-value loop limit does not constrain that recursion.

Track the keys visited by each resolution call and leave a reference unresolved when it points back to a key already being resolved. This matches the existing direct self-reference behavior while allowing ordinary acyclic references and ValueMapper processing to continue. There is no shared state between calls.

An isolated reproducer on the previous code terminated with fatal error: stack overflow (stack capped at 1 MiB for safety). After the change it returns %(a)s. New tests cover two-key and three-key cycles; existing self-reference, default-section and mapper tests pass. go test -race ./..., go vet ./..., go test -cover ./... (93.7% reported statement coverage), gofmt and git diff --check pass on macOS/Go 1.27.1. Remote CI is tracked separately.

Prepared with OpenAI Codex assistance on behalf of rupayon123. No independent human review is claimed.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant