aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/image
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2022-12-17 15:08:10 +0100
committerDmitry Vyukov <dvyukov@google.com>2022-12-22 10:11:08 +0100
commitc692fab1c2ff0de2554c5940f77ac8c168e729b2 (patch)
tree4f8e937dc3c11221f510f69abf408727b32067bc /pkg/image
parentfb1fed72556fcc8fbe60d75a7e70a188f373aa19 (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.go10
-rw-r--r--pkg/image/compression_nonoptimized.go2
-rw-r--r--pkg/image/compression_optimized.go2
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.