Skip to content

Commit

Permalink
fix: avoid panic in gzip decompress with nil input
Browse files Browse the repository at this point in the history
  • Loading branch information
adamdecaf committed Sep 3, 2024
1 parent 3af5bfd commit deb6c91
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 0 deletions.
12 changes: 12 additions & 0 deletions compressor_gzip.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,24 +54,35 @@ func GzipRequired(level int) Compressor {
}

func (g *gzipCompressor) compress(data []byte) ([]byte, error) {
if len(data) == 0 {
return nil, nil
}

var buf bytes.Buffer
w, err := gzip.NewWriterLevel(&buf, g.level)
if err != nil {
return nil, fmt.Errorf("gzip writer (level=%d) create: %w", g.level, err)
}

_, err = w.Write(data)
if err != nil {
w.Close()
return nil, fmt.Errorf("gzip compress: %w", err)
}

err = w.Close()
if err != nil {
return nil, fmt.Errorf("gzip writer close: %w", err)
}

return buf.Bytes(), nil
}

func (g *gzipCompressor) decompress(data []byte) ([]byte, error) {
if len(data) == 0 {
return nil, nil
}

r, err := gzip.NewReader(bytes.NewReader(data))
if err != nil {
if g.strict {
Expand All @@ -81,6 +92,7 @@ func (g *gzipCompressor) decompress(data []byte) ([]byte, error) {
return data, nil
}
}

bs, err := io.ReadAll(r)
if err != nil {
r.Close()
Expand Down
18 changes: 18 additions & 0 deletions compressor_gzip_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,24 @@ func TestGzip(t *testing.T) {
require.NoError(t, err)
require.Equal(t, plain, decompressed)
})

t.Run("empty", func(t *testing.T) {
out, err := gz.compress(nil)
require.NoError(t, err)

out, err = gz.decompress(out)
require.NoError(t, err)
require.Len(t, out, 0)

require.Equal(t, "", string(out))

// nil input
out, err = gz.decompress(nil)
require.NoError(t, err)
require.Len(t, out, 0)

require.Equal(t, "", string(out))
})
}

func TestGzipLevel(t *testing.T) {
Expand Down

0 comments on commit deb6c91

Please sign in to comment.