diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2022-12-17 15:08:10 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2022-12-22 10:11:08 +0100 |
| commit | c692fab1c2ff0de2554c5940f77ac8c168e729b2 (patch) | |
| tree | 4f8e937dc3c11221f510f69abf408727b32067bc /pkg/image | |
| parent | fb1fed72556fcc8fbe60d75a7e70a188f373aa19 (diff) | |
pkg/image: treat empty compressed image as valid image
When we decompress images for mutation or hints,
we always specially check for empty compressed data
(I assume it can apper after minimization).
Treat it as correct compressed and return empty decompressed data.
This removes the need in special handling in users.
Diffstat (limited to 'pkg/image')
| -rw-r--r-- | pkg/image/compression.go | 10 | ||||
| -rw-r--r-- | pkg/image/compression_nonoptimized.go | 2 | ||||
| -rw-r--r-- | pkg/image/compression_optimized.go | 2 |
3 files changed, 12 insertions, 2 deletions
diff --git a/pkg/image/compression.go b/pkg/image/compression.go index 83a479b62..c374ed07b 100644 --- a/pkg/image/compression.go +++ b/pkg/image/compression.go @@ -29,11 +29,21 @@ func Compress(rawData []byte) []byte { return buffer.Bytes() } +func MustDecompress(compressed []byte) (data []byte, dtor func()) { + if len(compressed) == 0 { + return nil, func() {} + } + return mustDecompress(compressed) +} + func DecompressCheck(compressed []byte) error { return decompressWriter(ioutil.Discard, compressed) } func decompressWriter(w io.Writer, compressed []byte) error { + if len(compressed) == 0 { + return nil + } zlibReader, err := zlib.NewReader(bytes.NewReader(compressed)) if err != nil { return fmt.Errorf("could not initialise zlib: %v", err) diff --git a/pkg/image/compression_nonoptimized.go b/pkg/image/compression_nonoptimized.go index 81b26350a..83e17c167 100644 --- a/pkg/image/compression_nonoptimized.go +++ b/pkg/image/compression_nonoptimized.go @@ -13,7 +13,7 @@ import ( var decompressMu sync.Mutex -func MustDecompress(compressed []byte) (data []byte, dtor func()) { +func mustDecompress(compressed []byte) (data []byte, dtor func()) { // Don't decompress more than one image at a time since it can consume lots of memory. // Reconsider when/if we move mutation to the host process. decompressMu.Lock() diff --git a/pkg/image/compression_optimized.go b/pkg/image/compression_optimized.go index bfb9dece2..ac043c3e7 100644 --- a/pkg/image/compression_optimized.go +++ b/pkg/image/compression_optimized.go @@ -29,7 +29,7 @@ var decompressPool = sync.Pool{New: func() interface{} { } }} -func MustDecompress(compressed []byte) (data []byte, dtor func()) { +func mustDecompress(compressed []byte) (data []byte, dtor func()) { // Optimized decompression procedure that is ~2x faster than a naive version // and consumes significantly less memory and generates less garbage. // Images tend to contain lots of 0s, especially the larger images. |
