]> Cypherpunks repositories - keks.git/commitdiff
RPC sequence overflow check
authorSergey Matveev <stargrave@stargrave.org>
Mon, 2 Jun 2025 10:52:13 +0000 (13:52 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Mon, 2 Jun 2025 10:52:13 +0000 (13:52 +0300)
go/rpc/client.go

index 96faa93e19046cf2cdd49619c62cdd2f7d11d221de04319ae7c8a2d7570883a2..309f13ae93d5a3b52d6bfcf64df19c80acf22fa82d25454fe5030382931846de 100644 (file)
@@ -39,6 +39,9 @@ func (cc *ClientCodec) WriteRequest(req *rpc.Request, data any) (err error) {
        cc.pendingM.Lock()
        cc.pending[req.Seq] = req.ServiceMethod
        cc.pendingM.Unlock()
+       if req.Seq == 0xFFFFFFFFFFFFFFFF {
+               panic("keks/rpc: WriteRequest: req.Seq overflow")
+       }
        if _, err = keks.Encode(cc.conn, []any{req.Seq + 1, req.ServiceMethod}, nil); err != nil {
                return fmt.Errorf("keks/rpc: WriteRequest: %w", err)
        }
@@ -58,7 +61,11 @@ func (cc *ClientCodec) ReadResponseHeader(resp *rpc.Response) (err error) {
                return fmt.Errorf("keks/rpc: ReadResponseHeader: %w", err)
        }
        list := r.([]any)
-       resp.Seq = list[0].(uint64) - 1
+       resp.Seq = list[0].(uint64)
+       if resp.Seq == 0 {
+               panic("keks/rpc: ReadResponseHeader: resp.Seq is zero")
+       }
+       resp.Seq--
        var ok bool
        cc.pendingM.Lock()
        resp.ServiceMethod, ok = cc.pending[resp.Seq]