From b2aa4a43cf154b885705085f23a12618d7513445 Mon Sep 17 00:00:00 2001 From: Alex Peters Date: Wed, 8 Nov 2023 09:24:04 +0100 Subject: [PATCH] Prevent empty channel version (cherry picked from commit fc549d46c493838fae3c1c00007a8087d9ac298a) --- x/wasm/ibc.go | 3 +++ x/wasm/ibc_integration_test.go | 37 +++++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/x/wasm/ibc.go b/x/wasm/ibc.go index 4cd6f8fd21..0197a03779 100644 --- a/x/wasm/ibc.go +++ b/x/wasm/ibc.go @@ -75,6 +75,9 @@ func (i IBCHandler) OnChanOpenInit( return "", err } if acceptedVersion == "" { // accept incoming version when nothing returned by contract + if version == "" { + return "", types.ErrEmpty.Wrap("version") + } acceptedVersion = version } diff --git a/x/wasm/ibc_integration_test.go b/x/wasm/ibc_integration_test.go index c5403759dd..421bdf33a5 100644 --- a/x/wasm/ibc_integration_test.go +++ b/x/wasm/ibc_integration_test.go @@ -21,21 +21,31 @@ import ( ) func TestOnChanOpenInitVersion(t *testing.T) { - const startVersion = "v1" + const v1 = "v1" specs := map[string]struct { - contractRsp *wasmvmtypes.IBC3ChannelOpenResponse - expVersion string + startVersion string + contractRsp *wasmvmtypes.IBC3ChannelOpenResponse + expVersion string + expErr bool }{ "different version": { - contractRsp: &wasmvmtypes.IBC3ChannelOpenResponse{Version: "v2"}, - expVersion: "v2", + startVersion: v1, + contractRsp: &wasmvmtypes.IBC3ChannelOpenResponse{Version: "v2"}, + expVersion: "v2", }, "no response": { - expVersion: startVersion, + startVersion: v1, + expVersion: v1, }, "empty result": { - contractRsp: &wasmvmtypes.IBC3ChannelOpenResponse{}, - expVersion: startVersion, + startVersion: v1, + contractRsp: &wasmvmtypes.IBC3ChannelOpenResponse{}, + expVersion: v1, + }, + "empty versions should fail": { + startVersion: "", + contractRsp: &wasmvmtypes.IBC3ChannelOpenResponse{}, + expErr: true, }, } for name, spec := range specs { @@ -63,10 +73,17 @@ func TestOnChanOpenInitVersion(t *testing.T) { path.EndpointA.ChannelConfig = &ibctesting.ChannelConfig{ PortID: contractInfo.IBCPortID, - Version: startVersion, + Version: spec.startVersion, Order: channeltypes.UNORDERED, } - require.NoError(t, path.EndpointA.ChanOpenInit()) + // when + gotErr := path.EndpointA.ChanOpenInit() + // then + if spec.expErr { + require.Error(t, gotErr) + return + } + require.NoError(t, gotErr) assert.Equal(t, spec.expVersion, path.EndpointA.ChannelConfig.Version) }) }