fix(configuration): time duration decode hook panic (#2960)

This fixes a potential panic in the time duration decode hook when the YAML value is a zero integer.
This commit is contained in:
James Elliott 2022-03-05 16:51:41 +11:00 committed by GitHub
parent 67846faacb
commit 1c1030c742
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 9 deletions

View File

@ -67,7 +67,11 @@ func ToTimeDurationFunc() mapstructure.DecodeHookFuncType {
switch {
case f.Kind() == reflect.String:
break
dataStr := data.(string)
if duration, err = utils.ParseDurationString(dataStr); err != nil {
return nil, err
}
case f.Kind() == reflect.Int:
seconds := data.(int)
@ -84,14 +88,6 @@ func ToTimeDurationFunc() mapstructure.DecodeHookFuncType {
duration = time.Second * time.Duration(seconds)
}
if duration == 0 {
dataStr := data.(string)
if duration, err = utils.ParseDurationString(dataStr); err != nil {
return nil, err
}
}
if ptr {
return &duration, nil
}

View File

@ -268,3 +268,25 @@ func TestToTimeDurationFunc_ShouldNotParse_FromBool(t *testing.T) {
assert.NoError(t, err)
assert.Equal(t, from, result)
}
func TestToTimeDurationFunc_ShouldParse_FromZero(t *testing.T) {
hook := ToTimeDurationFunc()
var (
from = 0
expected = time.Duration(0)
to time.Duration
ptrTo *time.Duration
result interface{}
err error
)
result, err = hook(reflect.TypeOf(from), reflect.TypeOf(to), from)
assert.NoError(t, err)
assert.Equal(t, expected, result)
result, err = hook(reflect.TypeOf(from), reflect.TypeOf(ptrTo), from)
assert.NoError(t, err)
assert.Equal(t, &expected, result)
}