Skip to content

Commit

Permalink
fix: add gRPC nil/zero check in query (backport #13352) (#13417)
Browse files Browse the repository at this point in the history
* fix: add gRPC nil/zero check in query (#13352)

(cherry picked from commit a9f02d9)

# Conflicts:
#	CHANGELOG.md
#	codec/proto_codec_test.go

* fix conflicts

* fix conflicts

Co-authored-by: yihuang <huang@crypto.com>
  • Loading branch information
mergify[bot] and yihuang committed Sep 29, 2022
1 parent 51c8a1a commit f80e883
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 6 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -66,6 +66,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
* (export) [#13029](https://github.com/cosmos/cosmos-sdk/pull/13029) Fix exporting the blockParams regression.
* [#13046](https://github.com/cosmos/cosmos-sdk/pull/13046) Fix missing return statement in BaseApp.Query.
* (store) [#13336](https://github.com/cosmos/cosmos-sdk/pull/13336) Call streaming listeners for deliver tx event, it was removed accidentally, backport #13334.
* (grpc) [#13417](https://github.com/cosmos/cosmos-sdk/pull/13417) fix grpc query panic that could crash the node (backport #13352).

## [v0.46.1](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.1) - 2022-08-24

Expand Down
12 changes: 6 additions & 6 deletions baseapp/grpcrouter_test.go
Expand Up @@ -33,9 +33,9 @@ func TestGRPCQueryRouter(t *testing.T) {
require.NotNil(t, res)
require.Equal(t, "hello", res.Message)

require.Panics(t, func() {
_, _ = client.Echo(context.Background(), nil)
})
res, err = client.Echo(context.Background(), nil)
require.Nil(t, err)
require.Empty(t, res.Message)

res2, err := client.SayHello(context.Background(), &testdata.SayHelloRequest{Name: "Foo"})
require.Nil(t, err)
Expand Down Expand Up @@ -151,9 +151,9 @@ func testQueryDataRacesSameHandler(t *testing.T, makeClientConn func(*baseapp.GR
require.NotNil(t, res)
require.Equal(t, "hello", res.Message)

require.Panics(t, func() {
_, _ = client.Echo(context.Background(), nil)
})
res, err = client.Echo(context.Background(), nil)
require.Nil(t, err)
require.Empty(t, res.Message)

res2, err := client.SayHello(context.Background(), &testdata.SayHelloRequest{Name: "Foo"})
require.Nil(t, err)
Expand Down
5 changes: 5 additions & 0 deletions codec/proto_codec.go
Expand Up @@ -43,6 +43,11 @@ func NewProtoCodec(interfaceRegistry types.InterfaceRegistry) *ProtoCodec {
// NOTE: this function must be used with a concrete type which
// implements proto.Message. For interface please use the codec.MarshalInterface
func (pc *ProtoCodec) Marshal(o ProtoMarshaler) ([]byte, error) {
// Size() check can catch the typed nil value.
if o == nil || o.Size() == 0 {
// return empty bytes instead of nil, because nil has special meaning in places like store.Set
return []byte{}, nil
}
return o.Marshal()
}

Expand Down

0 comments on commit f80e883

Please sign in to comment.