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.pull/2964/head
parent
67846faacb
commit
1c1030c742
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue