protobuf.nim enhancement to avoid crash due to bad handled Result object

This aims to avoid the error that appeared in status-go's
test-functional:

ERROR    root:statusgo_container.py:146 Container health check failed:
Container is not running. Status: exited. Logs (last 10 lines):
/go/src/github.com/status-im/status-go/vendor/github.com/waku-org/sds-go-bindings/third_party/nim-sds/vendor/nim-chronos/chronos/internal/asyncfutures.nim(624)
pollFor
/go/src/github.com/status-im/status-go/vendor/github.com/waku-org/sds-go-bindings/third_party/nim-sds/vendor/nim-chronos/chronos/internal/asyncengine.nim(150)
poll
/go/src/github.com/status-im/status-go/vendor/github.com/waku-org/sds-go-bindings/third_party/nim-sds/library/sds_thread/sds_thread.nim(45)
runSds
/go/src/github.com/status-im/status-go/vendor/github.com/waku-org/sds-go-bindings/third_party/nim-sds/vendor/nim-chronos/chronos/internal/asyncmacro.nim(71)
process
/go/src/github.com/status-im/status-go/vendor/github.com/waku-org/sds-go-bindings/third_party/nim-sds/library/sds_thread/inter_thread_communication/requests/sds_message_request.nim(65)
process
/go/src/github.com/status-im/status-go/vendor/github.com/waku-org/sds-go-bindings/third_party/nim-sds/src/reliability.nim(190)
unwrapReceivedMessage
/go/src/github.com/status-im/status-go/vendor/github.com/waku-org/sds-go-bindings/third_party/nim-sds/src/protobuf.nim(55)
extractChannelId
/go/src/github.com/status-im/status-go/vendor/github.com/waku-org/sds-go-bindings/third_party/nim-sds/vendor/nim-results/results.nim(445)
value
/go/src/github.com/status-im/status-go/vendor/github.com/waku-org/sds-go-bindings/third_party/nim-sds/vendor/nim-results/results.nim(433)
raiseResultDefect
Error: unhandled exception: Trying to access value with err Result:
BadWireType [ResultDefect]
This commit is contained in:
Ivan Folgueira Bande 2025-10-31 19:54:27 +01:00
parent 26e13dd87a
commit c82dad828a
No known key found for this signature in database
GPG Key ID: 3C117481F89E24A7

View File

@ -52,7 +52,9 @@ proc extractChannelId*(data: seq[byte]): Result[SdsChannelID, ReliabilityError]
try: try:
let pb = initProtoBuffer(data) let pb = initProtoBuffer(data)
var channelId: SdsChannelID var channelId: SdsChannelID
if not pb.getField(4, channelId).get(): let fieldOk = pb.getField(4, channelId).valueOr:
return err(ReliabilityError.reDeserializationError)
if not fieldOk:
return err(ReliabilityError.reDeserializationError) return err(ReliabilityError.reDeserializationError)
ok(channelId) ok(channelId)
except: except:
@ -99,9 +101,19 @@ proc deserializeBloomFilter*(data: seq[byte]): Result[BloomFilter, ReliabilityEr
var cap, errRate, kHashes, mBits: uint64 var cap, errRate, kHashes, mBits: uint64
try: try:
if not pb.getField(1, bytes).get() or not pb.getField(2, cap).get() or let
not pb.getField(3, errRate).get() or not pb.getField(4, kHashes).get() or field1_Ok = pb.getField(1, bytes).valueOr:
not pb.getField(5, mBits).get(): return err(ReliabilityError.reDeserializationError)
field2_Ok = pb.getField(2, cap).valueOr:
return err(ReliabilityError.reDeserializationError)
field3_Ok = pb.getField(3, errRate).valueOr:
return err(ReliabilityError.reDeserializationError)
field4_Ok = pb.getField(4, kHashes).valueOr:
return err(ReliabilityError.reDeserializationError)
field5_Ok = pb.getField(5, mBits).valueOr:
return err(ReliabilityError.reDeserializationError)
if not field1_Ok or not field2_Ok or not field3_Ok or not field4_Ok or not field5_Ok:
return err(ReliabilityError.reDeserializationError) return err(ReliabilityError.reDeserializationError)
# Convert bytes back to intArray # Convert bytes back to intArray