From 09d78157622e6ee9f01e52c448a93b23e7456ca4 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 9 Oct 2014 20:57:32 -0700 Subject: [PATCH] fix a crash if a non-pointer is given to Decode /cc @sethvargo --- decoder.go | 8 +++++++- decoder_test.go | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/decoder.go b/decoder.go index 2fcac72..3ebfbbe 100644 --- a/decoder.go +++ b/decoder.go @@ -1,6 +1,7 @@ package hcl import ( + "errors" "fmt" "reflect" "sort" @@ -27,8 +28,13 @@ func Decode(out interface{}, in string) error { // DecodeObject is a lower-level version of Decode. It decodes a // raw Object into the given output. func DecodeObject(out interface{}, n *hcl.Object) error { + val := reflect.ValueOf(out) + if val.Kind() != reflect.Ptr { + return errors.New("result must be a pointer") + } + var d decoder - return d.decode("root", n, reflect.ValueOf(out).Elem()) + return d.decode("root", n, val.Elem()) } type decoder struct { diff --git a/decoder_test.go b/decoder_test.go index 3a488c0..7c7700b 100644 --- a/decoder_test.go +++ b/decoder_test.go @@ -425,6 +425,14 @@ func TestDecode_structureMap(t *testing.T) { } } +func TestDecode_interfaceNonPointer(t *testing.T) { + var value interface{} + err := Decode(value, testReadFile(t, "basic_int_string.hcl")) + if err == nil { + t.Fatal("should error") + } +} + func TestDecode_intString(t *testing.T) { var value struct { Count int