From 6e222375c777fad81a4b11f591e1b77ec9743e36 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Mon, 22 Jul 2019 17:16:18 -0400 Subject: [PATCH] invlaid use of dynamic with attrs should not panic Mistakenly using dynamic on an attribute will lead to a panic when attempting to resolve variable references with a partial body, because the dynamic blocks have yet to be expanded and validated. Check that the block element type is actually an object before generating a schema. --- lang/blocktoattr/variables.go | 2 +- lang/blocktoattr/variables_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lang/blocktoattr/variables.go b/lang/blocktoattr/variables.go index e123b8aab..b172805a0 100644 --- a/lang/blocktoattr/variables.go +++ b/lang/blocktoattr/variables.go @@ -33,7 +33,7 @@ func walkVariables(node dynblock.WalkVariablesNode, body hcl.Body, schema *confi for _, child := range children { if blockS, exists := schema.BlockTypes[child.BlockTypeName]; exists { vars = append(vars, walkVariables(child.Node, child.Body(), &blockS.Block)...) - } else if attrS, exists := schema.Attributes[child.BlockTypeName]; exists { + } else if attrS, exists := schema.Attributes[child.BlockTypeName]; exists && attrS.Type.ElementType().IsObjectType() { synthSchema := SchemaForCtyElementType(attrS.Type.ElementType()) vars = append(vars, walkVariables(child.Node, child.Body(), synthSchema)...) } diff --git a/lang/blocktoattr/variables_test.go b/lang/blocktoattr/variables_test.go index ae469a064..9eaf5adb7 100644 --- a/lang/blocktoattr/variables_test.go +++ b/lang/blocktoattr/variables_test.go @@ -21,6 +21,10 @@ func TestExpandedVariables(t *testing.T) { })), Optional: true, }, + "bar": { + Type: cty.Map(cty.String), + Optional: true, + }, }, } @@ -143,6 +147,29 @@ dynamic "foo" { }, }, }, + "misplaced dynamic block": { + src: ` +dynamic "bar" { + for_each = beep + content { + key = val + } +} +`, + schema: fooSchema, + want: []hcl.Traversal{ + { + hcl.TraverseRoot{ + Name: "beep", + SrcRange: hcl.Range{ + Filename: "test.tf", + Start: hcl.Pos{Line: 3, Column: 14, Byte: 30}, + End: hcl.Pos{Line: 3, Column: 18, Byte: 34}, + }, + }, + }, + }, + }, } for name, test := range tests {