Skip to content

Commit 7ae1b71

Browse files
(gosec) Apply G115 fixes to internal/driverutil package
Address gosec G115 integer overflow warnings: - Add SafeConvertNumeric for server version and option conversions
1 parent 743a394 commit 7ae1b71

File tree

1 file changed

+39
-8
lines changed

1 file changed

+39
-8
lines changed

internal/driverutil/description.go

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"go.mongodb.org/mongo-driver/v2/bson"
1515
"go.mongodb.org/mongo-driver/v2/internal/bsonutil"
1616
"go.mongodb.org/mongo-driver/v2/internal/handshake"
17+
"go.mongodb.org/mongo-driver/v2/internal/mathutil"
1718
"go.mongodb.org/mongo-driver/v2/internal/ptrutil"
1819
"go.mongodb.org/mongo-driver/v2/mongo/address"
1920
"go.mongodb.org/mongo-driver/v2/tag"
@@ -314,21 +315,36 @@ func NewServerDescription(addr address.Address, response bson.Raw) description.S
314315
desc.LastError = fmt.Errorf("expected 'maxBsonObjectSize' to be an integer but it's a BSON %s", element.Value().Type)
315316
return desc
316317
}
317-
desc.MaxDocumentSize = uint32(i64)
318+
size, err := mathutil.SafeConvertNumeric[uint32](i64)
319+
if err != nil {
320+
desc.LastError = fmt.Errorf("maxBsonObjectSize value out of range: %d", i64)
321+
return desc
322+
}
323+
desc.MaxDocumentSize = size
318324
case "maxMessageSizeBytes":
319325
i64, ok := element.Value().AsInt64OK()
320326
if !ok {
321327
desc.LastError = fmt.Errorf("expected 'maxMessageSizeBytes' to be an integer but it's a BSON %s", element.Value().Type)
322328
return desc
323329
}
324-
desc.MaxMessageSize = uint32(i64)
330+
size, err := mathutil.SafeConvertNumeric[uint32](i64)
331+
if err != nil {
332+
desc.LastError = fmt.Errorf("maxMessageSizeBytes value out of range: %d", i64)
333+
return desc
334+
}
335+
desc.MaxMessageSize = size
325336
case "maxWriteBatchSize":
326337
i64, ok := element.Value().AsInt64OK()
327338
if !ok {
328339
desc.LastError = fmt.Errorf("expected 'maxWriteBatchSize' to be an integer but it's a BSON %s", element.Value().Type)
329340
return desc
330341
}
331-
desc.MaxBatchCount = uint32(i64)
342+
count, err := mathutil.SafeConvertNumeric[uint32](i64)
343+
if err != nil {
344+
desc.LastError = fmt.Errorf("maxWriteBatchSize value out of range: %d", i64)
345+
return desc
346+
}
347+
desc.MaxBatchCount = count
332348
case "me":
333349
me, ok := element.Value().StringValueOK()
334350
if !ok {
@@ -338,18 +354,28 @@ func NewServerDescription(addr address.Address, response bson.Raw) description.S
338354
desc.CanonicalAddr = address.Address(me).Canonicalize()
339355
case "maxWireVersion":
340356
verMax, ok := element.Value().AsInt64OK()
341-
versionRange.Max = int32(verMax)
342357
if !ok {
343-
desc.LastError = fmt.Errorf("expected 'maxWireVersion' to be an integer but it's a BSON %s", element.Value().Type)
358+
desc.LastError = fmt.Errorf("invalid maxWireVersion value")
344359
return desc
345360
}
361+
max, err := mathutil.SafeConvertNumeric[int32](verMax)
362+
if err != nil {
363+
desc.LastError = fmt.Errorf("invalid maxWireVersion value: %w", err)
364+
return desc
365+
}
366+
versionRange.Max = max
346367
case "minWireVersion":
347368
verMin, ok := element.Value().AsInt64OK()
348-
versionRange.Min = int32(verMin)
349369
if !ok {
350-
desc.LastError = fmt.Errorf("expected 'minWireVersion' to be an integer but it's a BSON %s", element.Value().Type)
370+
desc.LastError = fmt.Errorf("invalid minWireVersion value")
351371
return desc
352372
}
373+
min, err := mathutil.SafeConvertNumeric[int32](verMin)
374+
if err != nil {
375+
desc.LastError = fmt.Errorf("invalid minWireVersion value: %w", err)
376+
return desc
377+
}
378+
versionRange.Min = min
353379
case "msg":
354380
msg, ok = element.Value().StringValueOK()
355381
if !ok {
@@ -416,7 +442,12 @@ func NewServerDescription(addr address.Address, response bson.Raw) description.S
416442
desc.LastError = fmt.Errorf("expected 'setVersion' to be an integer but it's a BSON %s", element.Value().Type)
417443
return desc
418444
}
419-
desc.SetVersion = uint32(i64)
445+
version, err := mathutil.SafeConvertNumeric[uint32](i64)
446+
if err != nil {
447+
desc.LastError = fmt.Errorf("setVersion value out of range: %d", i64)
448+
return desc
449+
}
450+
desc.SetVersion = version
420451
case "tags":
421452
m, err := decodeStringMap(element, "tags")
422453
if err != nil {

0 commit comments

Comments
 (0)