]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
import: don't invoke compress callbacks with empty data
authorLennart Poettering <lennart@poettering.net>
Thu, 28 Jan 2021 17:16:01 +0000 (18:16 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 29 Jan 2021 15:40:20 +0000 (16:40 +0100)
It's pointless if no data was generated. (This happens if an empty file
is compressed)

src/import/import-compress.c

index b89ffb1b2ac925000609f03210c6d6356deb567e..c016587e14fe4b695cfeb22c81ecc0f087ce77c8 100644 (file)
@@ -125,9 +125,11 @@ int import_uncompress(ImportCompress *c, const void *data, size_t size, ImportCo
                         if (!IN_SET(lzr, LZMA_OK, LZMA_STREAM_END))
                                 return -EIO;
 
-                        r = callback(buffer, sizeof(buffer) - c->xz.avail_out, userdata);
-                        if (r < 0)
-                                return r;
+                        if (c->xz.avail_out < sizeof(buffer)) {
+                                r = callback(buffer, sizeof(buffer) - c->xz.avail_out, userdata);
+                                if (r < 0)
+                                        return r;
+                        }
                 }
 
                 break;
@@ -146,9 +148,11 @@ int import_uncompress(ImportCompress *c, const void *data, size_t size, ImportCo
                         if (!IN_SET(r, Z_OK, Z_STREAM_END))
                                 return -EIO;
 
-                        r = callback(buffer, sizeof(buffer) - c->gzip.avail_out, userdata);
-                        if (r < 0)
-                                return r;
+                        if (c->gzip.avail_out < sizeof(buffer)) {
+                                r = callback(buffer, sizeof(buffer) - c->gzip.avail_out, userdata);
+                                if (r < 0)
+                                        return r;
+                        }
                 }
 
                 break;
@@ -168,9 +172,11 @@ int import_uncompress(ImportCompress *c, const void *data, size_t size, ImportCo
                         if (!IN_SET(r, BZ_OK, BZ_STREAM_END))
                                 return -EIO;
 
-                        r = callback(buffer, sizeof(buffer) - c->bzip2.avail_out, userdata);
-                        if (r < 0)
-                                return r;
+                        if (c->bzip2.avail_out < sizeof(buffer)) {
+                                r = callback(buffer, sizeof(buffer) - c->bzip2.avail_out, userdata);
+                                if (r < 0)
+                                        return r;
+                        }
                 }
 
                 break;