From 26128548a5b317e3d61049bdd157c0efd7a3f775 Mon Sep 17 00:00:00 2001 From: Kyle Havlovitz Date: Wed, 19 Apr 2023 10:23:38 -0700 Subject: [PATCH] Avoid decoding nil pointer in map walker (#17048) --- .changelog/17048.txt | 3 +++ lib/map_walker.go | 2 +- lib/map_walker_test.go | 10 ++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 .changelog/17048.txt diff --git a/.changelog/17048.txt b/.changelog/17048.txt new file mode 100644 index 000000000..74f31c7ce --- /dev/null +++ b/.changelog/17048.txt @@ -0,0 +1,3 @@ +```release-note:bug +Fix an bug where decoding some Config structs with unset pointer fields could fail with `reflect: call of reflect.Value.Type on zero Value`. +``` diff --git a/lib/map_walker.go b/lib/map_walker.go index 8a0aeaf55..3e8cec77c 100644 --- a/lib/map_walker.go +++ b/lib/map_walker.go @@ -113,7 +113,7 @@ func (w *mapWalker) MapElem(m, k, v reflect.Value) error { return nil } - if inner := v.Elem(); inner.Type() == typMapIfaceIface { + if inner := v.Elem(); inner.IsValid() && inner.Type() == typMapIfaceIface { // map[interface{}]interface{}, attempt to weakly decode into string keys var target map[string]interface{} if err := mapstructure.WeakDecode(v.Interface(), &target); err != nil { diff --git a/lib/map_walker_test.go b/lib/map_walker_test.go index b4d13bcca..2a3b4c189 100644 --- a/lib/map_walker_test.go +++ b/lib/map_walker_test.go @@ -41,6 +41,16 @@ func TestMapWalk(t *testing.T) { }, unexpected: true, }, + // ensure we don't panic from trying to call reflect.Value.Type + // on a nil pointer + "nil pointer": { + input: map[string]interface{}{ + "foo": nil, + }, + expected: map[string]interface{}{ + "foo": nil, + }, + }, // ensure nested maps get processed correctly "nested": { input: map[string]interface{}{