Skip to content

Commit 6e1a082

Browse files
authored
chore: add packet data validation back (#6704)
1 parent 37d7335 commit 6e1a082

File tree

4 files changed

+71
-18
lines changed

4 files changed

+71
-18
lines changed

modules/apps/transfer/ibc_module.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@ func (im IBCModule) OnRecvPacket(
191191

192192
ack := channeltypes.NewResultAcknowledgement([]byte{byte(1)})
193193

194+
// we are explicitly wrapping this emit event call in an anonymous function so that
195+
// the packet data is evaluated after it has been assigned a value.
194196
defer func() {
195197
events.EmitOnRecvPacketEvent(ctx, data, ack, ackErr)
196198
}()

modules/apps/transfer/keeper/export_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,6 @@ func (k Keeper) UnwindHops(ctx sdk.Context, msg *types.MsgTransfer) (*types.MsgT
3939
}
4040

4141
// CreatePacketDataBytesFromVersion is a wrapper around createPacketDataBytesFromVersion for testing purposes
42-
func CreatePacketDataBytesFromVersion(appVersion, sender, receiver, memo string, tokens types.Tokens, hops []types.Hop) []byte {
42+
func CreatePacketDataBytesFromVersion(appVersion, sender, receiver, memo string, tokens types.Tokens, hops []types.Hop) ([]byte, error) {
4343
return createPacketDataBytesFromVersion(appVersion, sender, receiver, memo, tokens, hops)
4444
}

modules/apps/transfer/keeper/relay.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,10 @@ func (k Keeper) sendTransfer(
147147
tokens = append(tokens, token)
148148
}
149149

150-
packetDataBytes := createPacketDataBytesFromVersion(appVersion, sender.String(), receiver, memo, tokens, forwarding.Hops)
150+
packetDataBytes, err := createPacketDataBytesFromVersion(appVersion, sender.String(), receiver, memo, tokens, forwarding.Hops)
151+
if err != nil {
152+
return 0, err
153+
}
151154

152155
sequence, err := k.ics4Wrapper.SendPacket(ctx, channelCap, sourcePort, sourceChannel, timeoutHeight, timeoutTimestamp, packetDataBytes)
153156
if err != nil {
@@ -438,8 +441,7 @@ func (k Keeper) tokenFromCoin(ctx sdk.Context, coin sdk.Coin) (types.Token, erro
438441
}
439442

440443
// createPacketDataBytesFromVersion creates the packet data bytes to be sent based on the application version.
441-
func createPacketDataBytesFromVersion(appVersion, sender, receiver, memo string, tokens types.Tokens, hops []types.Hop) []byte {
442-
var packetDataBytes []byte
444+
func createPacketDataBytesFromVersion(appVersion, sender, receiver, memo string, tokens types.Tokens, hops []types.Hop) ([]byte, error) {
443445
switch appVersion {
444446
case types.V1:
445447
// Sanity check, tokens must always be of length 1 if using app version V1.
@@ -449,7 +451,12 @@ func createPacketDataBytesFromVersion(appVersion, sender, receiver, memo string,
449451

450452
token := tokens[0]
451453
packetData := types.NewFungibleTokenPacketData(token.Denom.Path(), token.Amount, sender, receiver, memo)
452-
packetDataBytes = packetData.GetBytes()
454+
455+
if err := packetData.ValidateBasic(); err != nil {
456+
return nil, errorsmod.Wrapf(err, "failed to validate %s packet data", types.V1)
457+
}
458+
459+
return packetData.GetBytes(), nil
453460
case types.V2:
454461
// If forwarding is needed, move memo to forwarding packet data and set packet.Memo to empty string.
455462
var forwardingPacketData types.ForwardingPacketData
@@ -459,12 +466,15 @@ func createPacketDataBytesFromVersion(appVersion, sender, receiver, memo string,
459466
}
460467

461468
packetData := types.NewFungibleTokenPacketDataV2(tokens, sender, receiver, memo, forwardingPacketData)
462-
packetDataBytes = packetData.GetBytes()
469+
470+
if err := packetData.ValidateBasic(); err != nil {
471+
return nil, errorsmod.Wrapf(err, "failed to validate %s packet data", types.V2)
472+
}
473+
474+
return packetData.GetBytes(), nil
463475
default:
464476
panic(fmt.Errorf("app version must be one of %s", types.SupportedVersions))
465477
}
466-
467-
return packetDataBytes
468478
}
469479

470480
// burnCoin sends coins from the account to the transfer module account and then burn them.

modules/apps/transfer/keeper/relay_test.go

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,34 +1287,61 @@ func (suite *KeeperTestSuite) TestPacketForwardsCompatibility() {
12871287

12881288
func (suite *KeeperTestSuite) TestCreatePacketDataBytesFromVersion() {
12891289
var (
1290-
bz []byte
1291-
tokens types.Tokens
1290+
bz []byte
1291+
tokens types.Tokens
1292+
sender, receiver string
12921293
)
12931294

12941295
testCases := []struct {
12951296
name string
12961297
appVersion string
12971298
malleate func()
1298-
expResult func(bz []byte)
1299+
expResult func(bz []byte, err error)
12991300
expPanicErr error
13001301
}{
13011302
{
13021303
"success",
13031304
types.V1,
13041305
func() {},
1305-
func(bz []byte) {
1306-
expPacketData := types.NewFungibleTokenPacketData("", "", "", "", "")
1306+
func(bz []byte, err error) {
1307+
expPacketData := types.NewFungibleTokenPacketData(ibctesting.TestCoin.Denom, ibctesting.TestCoin.Amount.String(), sender, receiver, "")
13071308
suite.Require().Equal(bz, expPacketData.GetBytes())
1309+
suite.Require().NoError(err)
13081310
},
13091311
nil,
13101312
},
13111313
{
13121314
"success: version 2",
13131315
types.V2,
13141316
func() {},
1315-
func(bz []byte) {
1316-
expPacketData := types.NewFungibleTokenPacketDataV2(types.Tokens{types.Token{}}, "", "", "", emptyForwardingPacketData)
1317+
func(bz []byte, err error) {
1318+
expPacketData := types.NewFungibleTokenPacketDataV2(tokens, sender, receiver, "", emptyForwardingPacketData)
13171319
suite.Require().Equal(bz, expPacketData.GetBytes())
1320+
suite.Require().NoError(err)
1321+
},
1322+
nil,
1323+
},
1324+
{
1325+
"failure: fails v1 validation",
1326+
types.V1,
1327+
func() {
1328+
sender = ""
1329+
},
1330+
func(bz []byte, err error) {
1331+
suite.Require().Nil(bz)
1332+
suite.Require().ErrorIs(err, ibcerrors.ErrInvalidAddress)
1333+
},
1334+
nil,
1335+
},
1336+
{
1337+
"failure: fails v2 validation",
1338+
types.V2,
1339+
func() {
1340+
sender = ""
1341+
},
1342+
func(bz []byte, err error) {
1343+
suite.Require().Nil(bz)
1344+
suite.Require().ErrorIs(err, ibcerrors.ErrInvalidAddress)
13181345
},
13191346
nil,
13201347
},
@@ -1338,20 +1365,34 @@ func (suite *KeeperTestSuite) TestCreatePacketDataBytesFromVersion() {
13381365

13391366
for _, tc := range testCases {
13401367
suite.Run(tc.name, func() {
1341-
tokens = types.Tokens{types.Token{}}
1368+
suite.SetupTest()
1369+
1370+
path := ibctesting.NewTransferPath(suite.chainA, suite.chainB)
1371+
path.Setup()
1372+
1373+
tokens = types.Tokens{
1374+
{
1375+
Amount: ibctesting.TestCoin.Amount.String(),
1376+
Denom: types.NewDenom(ibctesting.TestCoin.Denom),
1377+
},
1378+
}
1379+
1380+
sender = suite.chainA.SenderAccount.GetAddress().String()
1381+
receiver = suite.chainB.SenderAccount.GetAddress().String()
13421382

13431383
tc.malleate()
13441384

1385+
var err error
13451386
createFunc := func() {
1346-
bz = transferkeeper.CreatePacketDataBytesFromVersion(tc.appVersion, "", "", "", tokens, nil)
1387+
bz, err = transferkeeper.CreatePacketDataBytesFromVersion(tc.appVersion, sender, receiver, "", tokens, nil)
13471388
}
13481389

13491390
expPanic := tc.expPanicErr != nil
13501391
if expPanic {
13511392
suite.Require().PanicsWithError(tc.expPanicErr.Error(), createFunc)
13521393
} else {
13531394
createFunc()
1354-
tc.expResult(bz)
1395+
tc.expResult(bz, err)
13551396
}
13561397
})
13571398
}

0 commit comments

Comments
 (0)