Files
wasmd/x/wasm/ioutils/ioutil.go
pinosu dd22204644 Add store code authz (#1591)
* Start implementation

* Add implementation + some e2e test

* Fix lint

* Fix comments

* Add ante handler

* Add cli cmd + more test cases

* Add cli tests

* Add ante handler test

* Add more tests

* Fix comments

* Enable empty permissions for the grant

* Fix lint

* Update version
2023-09-14 13:28:57 +02:00

49 lines
1.1 KiB
Go

package ioutils
import (
"bytes"
"compress/gzip"
"errors"
"io"
errorsmod "cosmossdk.io/errors"
)
var errLimit = errors.New("exceeds limit")
// Uncompress expects a valid gzip source to unpack or fails. See IsGzip
func Uncompress(gzipSrc []byte, limit int64) ([]byte, error) {
if int64(len(gzipSrc)) > limit {
return nil, errorsmod.Wrapf(errLimit, "max %d bytes", limit)
}
zr, err := gzip.NewReader(bytes.NewReader(gzipSrc))
if err != nil {
return nil, err
}
zr.Multistream(false)
defer zr.Close()
bz, err := io.ReadAll(LimitReader(zr, limit))
if errors.Is(err, errLimit) {
return nil, errorsmod.Wrapf(errLimit, "max %d bytes", limit)
}
return bz, err
}
// LimitReader returns a Reader that reads from r
// but stops with "limit error" after n bytes.
// The underlying implementation is a *io.LimitedReader.
func LimitReader(r io.Reader, n int64) io.Reader {
return &LimitedReader{r: &io.LimitedReader{R: r, N: n}}
}
type LimitedReader struct {
r *io.LimitedReader
}
func (l *LimitedReader) Read(p []byte) (n int, err error) {
if l.r.N <= 0 {
return 0, errLimit
}
return l.r.Read(p)
}