Skip to content

hclsyntax parser crashes with fatal error: stack overflow on deeply nested parentheses #809

Description

@denis256

The hclsyntax recursive-descent parser has no nesting-depth limit, so a config with deeply nested parentheses overflows the goroutine stack and aborts with fatal error: stack overflow. This is a Go fatal error, not a panic, so recover() cannot catch it — the whole process dies.

terraform apply
runtime: goroutine stack exceeds 1000000000-byte limit
runtime: sp=0xc0244d4948 stack=[0xc0244d4000, 0xc0444d4000]
fatal error: stack overflow

runtime stack:
runtime.throw({0x27eac9b?, 0x40b26c0?})
	/opt/hostedtoolcache/go/1.20.0/x64/src/runtime/panic.go:1047 +0x5d fp=0xc000113e18 sp=0xc000113de8 pc=0x43547d
runtime.newstack()
	/opt/hostedtoolcache/go/1.20.0/x64/src/runtime/stack.go:1105 +0x5bd fp=0xc000113fc8 sp=0xc000113e18 pc=0x44eedd
runtime.morestack()
	/opt/hostedtoolcache/go/1.20.0/x64/src/runtime/asm_amd64.s:574 +0x8b fp=0xc000113fd0 sp=0xc000113fc8 pc=0x4662cb

goroutine 1 [running]:
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseExpressionTerm(0xc0444d3120)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:944 +0x2429 fp=0xc0244d4958 sp=0xc0244d4950 pc=0x8399c9
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseExpressionWithTraversals(0x0?)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:619 +0x25 fp=0xc0244d49d8 sp=0xc0244d4958 pc=0x832265
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0x0?, {0xc0000d8f58?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:549 +0x138 fp=0xc0244d4f08 sp=0xc0244d49d8 pc=0x831718
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f58?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244d5438 sp=0xc0244d4f08 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f50?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244d5968 sp=0xc0244d5438 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f48?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244d5e98 sp=0xc0244d5968 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f40?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244d63c8 sp=0xc0244d5e98 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f38?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244d68f8 sp=0xc0244d63c8 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f30?, 0x1?, 0x2817f?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244d6e28 sp=0xc0244d68f8 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseTernaryConditional(0xc0444d3120)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:495 +0xfe fp=0xc0244d73c8 sp=0xc0244d6e28 pc=0x8309de
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).ParseExpression(...)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:479
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseExpressionTerm(0xc0444d3120)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:953 +0x233 fp=0xc0244d8320 sp=0xc0244d73c8 pc=0x8377d3
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseExpressionWithTraversals(0x0?)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:619 +0x25 fp=0xc0244d83a0 sp=0xc0244d8320 pc=0x832265
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0x0?, {0xc0000d8f58?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:549 +0x138 fp=0xc0244d88d0 sp=0xc0244d83a0 pc=0x831718
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f58?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244d8e00 sp=0xc0244d88d0 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f50?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244d9330 sp=0xc0244d8e00 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f48?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244d9860 sp=0xc0244d9330 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f40?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244d9d90 sp=0xc0244d9860 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f38?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244da2c0 sp=0xc0244d9d90 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f30?, 0x1?, 0x28180?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244da7f0 sp=0xc0244da2c0 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseTernaryConditional(0xc0444d3120)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:495 +0xfe fp=0xc0244dad90 sp=0xc0244da7f0 pc=0x8309de
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).ParseExpression(...)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:479
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseExpressionTerm(0xc0444d3120)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:953 +0x233 fp=0xc0244dbce8 sp=0xc0244dad90 pc=0x8377d3
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseExpressionWithTraversals(0x0?)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:619 +0x25 fp=0xc0244dbd68 sp=0xc0244dbce8 pc=0x832265
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0x0?, {0xc0000d8f58?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:549 +0x138 fp=0xc0244dc298 sp=0xc0244dbd68 pc=0x831718
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f58?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244dc7c8 sp=0xc0244dc298 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f50?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244dccf8 sp=0xc0244dc7c8 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f48?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244dd228 sp=0xc0244dccf8 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f40?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244dd758 sp=0xc0244dd228 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f38?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244ddc88 sp=0xc0244dd758 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f30?, 0x1?, 0x28181?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244de1b8 sp=0xc0244ddc88 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseTernaryConditional(0xc0444d3120)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:495 +0xfe fp=0xc0244de758 sp=0xc0244de1b8 pc=0x8309de
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).ParseExpression(...)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:479
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseExpressionTerm(0xc0444d3120)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:953 +0x233 fp=0xc0244df6b0 sp=0xc0244de758 pc=0x8377d3
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseExpressionWithTraversals(0x0?)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:619 +0x25 fp=0xc0244df730 sp=0xc0244df6b0 pc=0x832265
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0x0?, {0xc0000d8f58?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:549 +0x138 fp=0xc0244dfc60 sp=0xc0244df730 pc=0x831718
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f58?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244e0190 sp=0xc0244dfc60 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f50?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244e06c0 sp=0xc0244e0190 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f48?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244e0bf0 sp=0xc0244e06c0 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f40?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244e1120 sp=0xc0244e0bf0 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f38?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244e1650 sp=0xc0244e1120 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f30?, 0x1?, 0x28182?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244e1b80 sp=0xc0244e1650 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseTernaryConditional(0xc0444d3120)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:495 +0xfe fp=0xc0244e2120 sp=0xc0244e1b80 pc=0x8309de
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).ParseExpression(...)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:479
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseExpressionTerm(0xc0444d3120)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:953 +0x233 fp=0xc0244e3078 sp=0xc0244e2120 pc=0x8377d3
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseExpressionWithTraversals(0x0?)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:619 +0x25 fp=0xc0244e30f8 sp=0xc0244e3078 pc=0x832265
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0x0?, {0xc0000d8f58?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:549 +0x138 fp=0xc0244e3628 sp=0xc0244e30f8 pc=0x831718
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f58?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244e3b58 sp=0xc0244e3628 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f50?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244e4088 sp=0xc0244e3b58 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f48?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244e45b8 sp=0xc0244e4088 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f40?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244e4ae8 sp=0xc0244e45b8 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f38?, 0x0?, 0x0?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244e5018 sp=0xc0244e4ae8 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseBinaryOps(0xc0444d3120, {0xc0000d8f30?, 0x1?, 0x28183?})
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:563 +0x7d fp=0xc0244e5548 sp=0xc0244e5018 pc=0x83165d
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).parseTernaryConditional(0xc0444d3120)
	/home/runner/go/pkg/mod/github.com/hashicorp/hcl/v2@v2.16.2/hclsyntax/parser.go:495 +0xfe fp=0xc0244e5ae8 sp=0xc0244e5548 pc=0x8309de
github.com/hashicorp/hcl/v2/hclsyntax.(*parser).ParseExpression(...)

Example:
main.tf.txt

terraform version
Terraform v1.5.0
on linux_amd64

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions