Skip to content

Commit d6596e0

Browse files
committed
Fix for security warning.
1 parent 4b29f33 commit d6596e0

File tree

1 file changed

+37
-8
lines changed

1 file changed

+37
-8
lines changed

maybe.go

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,15 @@ package fpgo
33
import (
44
"errors"
55
"fmt"
6+
"math"
67
"reflect"
78
"strconv"
89
)
910

11+
var (
12+
ErrConversionSizeOverflow = errors.New("size overflow")
13+
)
14+
1015
// MaybeDef Maybe inspired by Rx/Optional/Guava/Haskell
1116
type MaybeDef struct {
1217
ref interface{}
@@ -184,23 +189,35 @@ func (maybeSelf MaybeDef) ToInt() (int, error) {
184189
case bool:
185190
val, err := maybeSelf.ToBool()
186191
if val {
187-
return int(1), err
192+
return 1, err
188193
}
189-
return int(0), err
194+
return 0, err
190195
case int:
191196
return (ref).(int), nil
192197
case int32:
193198
val, err := maybeSelf.ToInt32()
199+
if val > math.MaxInt32 {
200+
return 0, ErrConversionSizeOverflow
201+
}
194202
return int(val), err
195203
case int64:
196204
val, err := maybeSelf.ToInt64()
205+
if val > math.MaxInt32 {
206+
return 0, ErrConversionSizeOverflow
207+
}
197208
return int(val), err
198209
case float32:
199210
val, err := maybeSelf.ToFloat32()
200-
return int(val), err
211+
if val > math.MaxInt32 {
212+
return 0, ErrConversionSizeOverflow
213+
}
214+
return int(math.Round(float64(val))), err
201215
case float64:
202216
val, err := maybeSelf.ToFloat64()
203-
return int(val), err
217+
if val > math.MaxInt32 {
218+
return 0, ErrConversionSizeOverflow
219+
}
220+
return int(math.Round(val)), err
204221
}
205222
}
206223

@@ -230,13 +247,19 @@ func (maybeSelf MaybeDef) ToInt32() (int32, error) {
230247
return (ref).(int32), nil
231248
case int64:
232249
val, err := maybeSelf.ToInt64()
250+
if val > math.MaxInt32 {
251+
return 0, ErrConversionSizeOverflow
252+
}
233253
return int32(val), err
234254
case float32:
235255
val, err := maybeSelf.ToFloat32()
236-
return int32(val), err
256+
if val > math.MaxInt32 {
257+
return 0, ErrConversionSizeOverflow
258+
}
259+
return int32(math.Round(float64(val))), err
237260
case float64:
238261
val, err := maybeSelf.ToFloat64()
239-
return int32(val), err
262+
return int32(math.Round(val)), err
240263
}
241264
}
242265

@@ -268,10 +291,16 @@ func (maybeSelf MaybeDef) ToInt64() (int64, error) {
268291
return (ref).(int64), nil
269292
case float32:
270293
val, err := maybeSelf.ToFloat32()
271-
return int64(val), err
294+
if val > math.MaxInt64 {
295+
return 0, ErrConversionSizeOverflow
296+
}
297+
return int64(math.Round(float64(val))), err
272298
case float64:
273299
val, err := maybeSelf.ToFloat64()
274-
return int64(val), err
300+
if val > math.MaxInt64 {
301+
return 0, ErrConversionSizeOverflow
302+
}
303+
return int64(math.Round(val)), err
275304
}
276305
}
277306

0 commit comments

Comments
 (0)