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