diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index c8a7ee663..b72257865 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -24,3 +24,4 @@ Friendly reminder, we have a [bug bounty program](https://hackerone.com/tendermi ### BUG FIXES +- [rpc/jsonrpc/server] \#6191 Correctly unmarshal `RPCRequest` when data is `null` (@melekes) diff --git a/rpc/jsonrpc/types/types.go b/rpc/jsonrpc/types/types.go index 54d17155c..4f05e14c2 100644 --- a/rpc/jsonrpc/types/types.go +++ b/rpc/jsonrpc/types/types.go @@ -57,27 +57,31 @@ type RPCRequest struct { // UnmarshalJSON custom JSON unmarshalling due to jsonrpcid being string or int func (req *RPCRequest) UnmarshalJSON(data []byte) error { - unsafeReq := &struct { + unsafeReq := struct { JSONRPC string `json:"jsonrpc"` ID interface{} `json:"id,omitempty"` Method string `json:"method"` Params json.RawMessage `json:"params"` // must be map[string]interface{} or []interface{} }{} + err := json.Unmarshal(data, &unsafeReq) if err != nil { return err } + + if unsafeReq.ID == nil { // notification + return nil + } + req.JSONRPC = unsafeReq.JSONRPC req.Method = unsafeReq.Method req.Params = unsafeReq.Params - if unsafeReq.ID == nil { - return nil - } id, err := idFromInterface(unsafeReq.ID) if err != nil { return err } req.ID = id + return nil }