From c82dad828aa2611c61f87720034938670779ebc3 Mon Sep 17 00:00:00 2001 From: Ivan Folgueira Bande Date: Fri, 31 Oct 2025 19:54:27 +0100 Subject: [PATCH] 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] --- src/protobuf.nim | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/protobuf.nim b/src/protobuf.nim index 1f6d600..278f24a 100644 --- a/src/protobuf.nim +++ b/src/protobuf.nim @@ -52,7 +52,9 @@ proc extractChannelId*(data: seq[byte]): Result[SdsChannelID, ReliabilityError] try: let pb = initProtoBuffer(data) 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) ok(channelId) except: @@ -99,9 +101,19 @@ proc deserializeBloomFilter*(data: seq[byte]): Result[BloomFilter, ReliabilityEr var cap, errRate, kHashes, mBits: uint64 try: - if not pb.getField(1, bytes).get() or not pb.getField(2, cap).get() or - not pb.getField(3, errRate).get() or not pb.getField(4, kHashes).get() or - not pb.getField(5, mBits).get(): + let + field1_Ok = pb.getField(1, bytes).valueOr: + 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) # Convert bytes back to intArray