fix: negative float32 overflow when unmarshalling (#3811)

Co-authored-by: kim1.jin <kim1.jin@bkyo.io>
master
Kimjin-gd 11 months ago committed by GitHub
parent 28c742a1e1
commit 6ec38ec056
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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) {

Loading…
Cancel
Save