conf: fix panic when integer keys are used (#865)

This commit is contained in:
aler9 2022-03-08 18:50:41 +01:00
parent eeb15773f9
commit f45abfb203

View File

@ -66,27 +66,41 @@ func loadFromFile(fpath string, conf *Conf) (bool, error) {
} }
// convert interface{} keys into string keys to avoid JSON errors // convert interface{} keys into string keys to avoid JSON errors
var convert func(i interface{}) interface{} var convert func(i interface{}) (interface{}, error)
convert = func(i interface{}) interface{} { convert = func(i interface{}) (interface{}, error) {
switch x := i.(type) { switch x := i.(type) {
case map[interface{}]interface{}: case map[interface{}]interface{}:
m2 := map[string]interface{}{} m2 := map[string]interface{}{}
for k, v := range x { 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{}: case []interface{}:
a2 := make([]interface{}, len(x)) a2 := make([]interface{}, len(x))
for i, v := range 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 // check for non-existent parameters
var checkNonExistentFields func(what interface{}, ref interface{}) error var checkNonExistentFields func(what interface{}, ref interface{}) error