From f45abfb2032fb45eeb252f804b8e87750eacee0b Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Tue, 8 Mar 2022 18:50:41 +0100 Subject: [PATCH] conf: fix panic when integer keys are used (#865) --- internal/conf/conf.go | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/internal/conf/conf.go b/internal/conf/conf.go index a38df05c..2aa0e75c 100644 --- a/internal/conf/conf.go +++ b/internal/conf/conf.go @@ -66,27 +66,41 @@ func loadFromFile(fpath string, conf *Conf) (bool, error) { } // convert interface{} keys into string keys to avoid JSON errors - var convert func(i interface{}) interface{} - convert = func(i interface{}) interface{} { + var convert func(i interface{}) (interface{}, error) + convert = func(i interface{}) (interface{}, error) { switch x := i.(type) { case map[interface{}]interface{}: m2 := map[string]interface{}{} for k, v := range x { - m2[k.(string)] = convert(v) + ks, ok := k.(string) + if !ok { + return nil, fmt.Errorf("integer keys are not supported (%v)", k) + } + + m2[ks], err = convert(v) + if err != nil { + return nil, err + } } - return m2 + return m2, nil case []interface{}: a2 := make([]interface{}, len(x)) for i, v := range x { - a2[i] = convert(v) + a2[i], err = convert(v) + if err != nil { + return nil, err + } } - return a2 + return a2, nil } - return i + return i, nil + } + temp, err = convert(temp) + if err != nil { + return false, err } - temp = convert(temp) // check for non-existent parameters var checkNonExistentFields func(what interface{}, ref interface{}) error