diff --git a/x/wasm/ioutils/ioutil.go b/x/wasm/ioutils/ioutil.go index a34a43e9ea..b671e5ad65 100644 --- a/x/wasm/ioutils/ioutil.go +++ b/x/wasm/ioutils/ioutil.go @@ -5,13 +5,15 @@ import ( "compress/gzip" "io" + errorsmod "cosmossdk.io/errors" + "github.com/CosmWasm/wasmd/x/wasm/types" ) // Uncompress expects a valid gzip source to unpack or fails. See IsGzip func Uncompress(gzipSrc []byte, limit uint64) ([]byte, error) { if uint64(len(gzipSrc)) > limit { - return nil, types.ErrLimit + return nil, types.ErrLimit.Wrapf("max %d bytes", limit) } zr, err := gzip.NewReader(bytes.NewReader(gzipSrc)) if err != nil { @@ -19,7 +21,11 @@ func Uncompress(gzipSrc []byte, limit uint64) ([]byte, error) { } zr.Multistream(false) defer zr.Close() - return io.ReadAll(LimitReader(zr, int64(limit))) + bz, err := io.ReadAll(LimitReader(zr, int64(limit))) + if types.ErrLimit.Is(err) { + return nil, errorsmod.Wrapf(err, "max %d bytes", limit) + } + return bz, err } // LimitReader returns a Reader that reads from r diff --git a/x/wasm/ioutils/ioutil_test.go b/x/wasm/ioutils/ioutil_test.go index 3399abf293..668c94aed6 100644 --- a/x/wasm/ioutils/ioutil_test.go +++ b/x/wasm/ioutils/ioutil_test.go @@ -4,6 +4,7 @@ import ( "bytes" "compress/gzip" "errors" + "github.com/cometbft/cometbft/libs/rand" "io" "os" "testing" @@ -52,8 +53,8 @@ func TestUncompress(t *testing.T) { src: asGzip(bytes.Repeat([]byte{0x1}, maxSize+1)), expError: types.ErrLimit, }, - "handle other big gzip output": { - src: asGzip(bytes.Repeat([]byte{0x1}, 2*maxSize)), + "handle big gzip archive": { + src: asGzip(rand.Bytes(2 * maxSize)), expError: types.ErrLimit, }, } diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 895eb8f773..b928c1a4ec 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -172,7 +172,7 @@ func (k Keeper) create(ctx sdk.Context, creator sdk.AccAddress, wasmCode []byte, ctx.GasMeter().ConsumeGas(k.gasRegister.UncompressCosts(len(wasmCode)), "Uncompress gzip bytecode") wasmCode, err = ioutils.Uncompress(wasmCode, uint64(types.MaxWasmSize)) if err != nil { - return 0, checksum, errorsmod.Wrap(types.ErrCreateFailed, err.Error()) + return 0, checksum, types.ErrCreateFailed.Wrap(errorsmod.Wrap(err, "uncompress wasm archive").Error()) } } @@ -214,7 +214,7 @@ func (k Keeper) importCode(ctx sdk.Context, codeID uint64, codeInfo types.CodeIn var err error wasmCode, err = ioutils.Uncompress(wasmCode, uint64(types.MaxWasmSize)) if err != nil { - return errorsmod.Wrap(types.ErrCreateFailed, err.Error()) + return types.ErrCreateFailed.Wrap(errorsmod.Wrap(err, "uncompress wasm archive").Error()) } } newCodeHash, err := k.wasmVM.Create(wasmCode)