From 04987758acfb72840585cc21a5b93f020ed75963 Mon Sep 17 00:00:00 2001
From: ko_oler <kooler89@gmail.com>
Date: Tue, 10 Oct 2023 11:50:22 +0300
Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?=
 =?UTF-8?q?=D0=BE=20=D0=9F=D0=A0:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?=
 =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20JSON,=20?=
 =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BF?=
 =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F?=
 =?UTF-8?q?=20uint64?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/schema/field/number.go      |  3 ++
 pkg/schema/field/number_test.go |  5 +--
 pkg/schema/test/object_test.go  | 60 +++++++++++++++++++++++++++++++++
 3 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/pkg/schema/field/number.go b/pkg/schema/field/number.go
index 1075ef2b..d8dc218f 100644
--- a/pkg/schema/field/number.go
+++ b/pkg/schema/field/number.go
@@ -90,6 +90,9 @@ func (NumberType) decode(_ context.Context, field *Field, v interface{}) (interf
 		case int64:
 			return i, nil
 		case uint64:
+			if i > maxInt {
+				return nil, errors.New("integer out of range")
+			}
 			return i, nil
 		case float64:
 			if i > maxInt || i < minInt {
diff --git a/pkg/schema/field/number_test.go b/pkg/schema/field/number_test.go
index 79709166..da154cd0 100644
--- a/pkg/schema/field/number_test.go
+++ b/pkg/schema/field/number_test.go
@@ -1,6 +1,7 @@
 package field
 
 import (
+	"context"
 	"math"
 	"reflect"
 	"testing"
@@ -42,7 +43,7 @@ func TestNumberField_Decode(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			got, err := Decode(nil, tt.field, tt.data)
+			got, err := Decode(context.Background(), tt.field, tt.data)
 			if (err != nil) != tt.wantErr {
 				t.Errorf("Decode() error = %v, wantErr %v", err, tt.wantErr)
 				return
@@ -82,7 +83,7 @@ func TestNumberField_Encode(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			got, err := Encode(nil, tt.field, tt.data)
+			got, err := Encode(context.Background(), tt.field, tt.data)
 			if (err != nil) != tt.wantErr {
 				t.Errorf("Decode() error = %v, wantErr %v", err, tt.wantErr)
 				return
diff --git a/pkg/schema/test/object_test.go b/pkg/schema/test/object_test.go
index e5af975c..4d9d13a5 100644
--- a/pkg/schema/test/object_test.go
+++ b/pkg/schema/test/object_test.go
@@ -74,6 +74,66 @@ func TestNumberField_JSON(t *testing.T) {
 	assert.Equal(t, fld, res)
 }
 
+func TestNumberField_JSON_With_MaxInt(t *testing.T) {
+	t.Run("Without overflow from int64", func(t *testing.T) {
+		fld := field.Object("num", field.Number(field.NumberFormatInt))
+
+		itemData := map[string]interface{}{"num": 1<<53 - 1}
+
+		b, err := json.Marshal(itemData)
+		require.NoError(t, err)
+
+		itemDataToDecode := make(map[string]interface{})
+		require.NoError(t, json.Unmarshal(b, &itemDataToDecode))
+
+		_, err = field.Decode(context.Background(), fld, itemDataToDecode)
+		require.NoError(t, err)
+	})
+	t.Run("With overflow from int64", func(t *testing.T) {
+		fld := field.Object("num", field.Number(field.NumberFormatInt))
+
+		itemData := map[string]interface{}{"num": 1 << 53}
+
+		b, err := json.Marshal(itemData)
+		require.NoError(t, err)
+
+		itemDataToDecode := make(map[string]interface{})
+		require.NoError(t, json.Unmarshal(b, &itemDataToDecode))
+
+		_, err = field.Decode(context.Background(), fld, itemDataToDecode)
+		require.Error(t, err, "integer out of range")
+	})
+	t.Run("With overflow from uint64", func(t *testing.T) {
+		fld := field.Object("num", field.Number(field.NumberFormatInt))
+
+		itemData := map[string]interface{}{"num": uint64(1 << 53)}
+
+		b, err := json.Marshal(itemData)
+		require.NoError(t, err)
+
+		itemDataToDecode := make(map[string]interface{})
+		require.NoError(t, json.Unmarshal(b, &itemDataToDecode))
+
+		_, err = field.Decode(context.Background(), fld, itemDataToDecode)
+		require.Error(t, err, "integer out of range")
+	})
+	t.Run("With overflow from float64", func(t *testing.T) {
+		fld := field.Object("num", field.Number(field.NumberFormatInt))
+
+		itemData := map[string]interface{}{"num": float64(1 << 53)}
+
+		b, err := json.Marshal(itemData)
+		require.NoError(t, err)
+
+		itemDataToDecode := make(map[string]interface{})
+		require.NoError(t, json.Unmarshal(b, &itemDataToDecode))
+
+		_, err = field.Decode(context.Background(), fld, itemDataToDecode)
+		require.Error(t, err, "integer out of range")
+	})
+
+}
+
 func TestSchema_JSON(t *testing.T) {
 	enumStr := field.String().AddOptions(
 		validate.Enum(
-- 
GitLab