fix: negative float32 overflow when unmarshalling (#3811)
Co-authored-by: kim1.jin <kim1.jin@bkyo.io>
This commit is contained in:
@@ -5,7 +5,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -622,7 +621,7 @@ func (u *Unmarshaler) processFieldPrimitiveWithJSONNumber(fieldType reflect.Type
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if fValue > math.MaxFloat32 {
|
if value.OverflowFloat(fValue) {
|
||||||
return fmt.Errorf("parsing %q as float32: value out of range", v.String())
|
return fmt.Errorf("parsing %q as float32: value out of range", v.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -976,6 +976,19 @@ func TestUnmarshalFloat32WithOverflow(t *testing.T) {
|
|||||||
assert.Error(t, UnmarshalKey(m, &in))
|
assert.Error(t, UnmarshalKey(m, &in))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("float32 from string less than float32", func(t *testing.T) {
|
||||||
|
type inner struct {
|
||||||
|
Value float32 `key:"float, string"`
|
||||||
|
}
|
||||||
|
|
||||||
|
m := map[string]any{
|
||||||
|
"float": "-1.79769313486231570814527423731704356798070e+300", // overflow
|
||||||
|
}
|
||||||
|
|
||||||
|
var in inner
|
||||||
|
assert.Error(t, UnmarshalKey(m, &in))
|
||||||
|
})
|
||||||
|
|
||||||
t.Run("float32 from json.Number greater than float64", func(t *testing.T) {
|
t.Run("float32 from json.Number greater than float64", func(t *testing.T) {
|
||||||
type inner struct {
|
type inner struct {
|
||||||
Value float32 `key:"float"`
|
Value float32 `key:"float"`
|
||||||
@@ -1001,6 +1014,19 @@ func TestUnmarshalFloat32WithOverflow(t *testing.T) {
|
|||||||
var in inner
|
var in inner
|
||||||
assert.Error(t, UnmarshalKey(m, &in))
|
assert.Error(t, UnmarshalKey(m, &in))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("float32 from json number less than float32", func(t *testing.T) {
|
||||||
|
type inner struct {
|
||||||
|
Value float32 `key:"float"`
|
||||||
|
}
|
||||||
|
|
||||||
|
m := map[string]any{
|
||||||
|
"float": json.Number("-1.79769313486231570814527423731704356798070e+300"), // overflow
|
||||||
|
}
|
||||||
|
|
||||||
|
var in inner
|
||||||
|
assert.Error(t, UnmarshalKey(m, &in))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUnmarshalFloat64WithOverflow(t *testing.T) {
|
func TestUnmarshalFloat64WithOverflow(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user