]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Fix streaming compression/decompression examples 1769/head
authorJan Kasiak <jan@cybojanek.net>
Sun, 1 Sep 2019 19:35:53 +0000 (15:35 -0400)
committerJan Kasiak <jan@cybojanek.net>
Sun, 1 Sep 2019 21:22:42 +0000 (17:22 -0400)
* Handle compression of empty file
* Error in decompression in case of trailing data

examples/streaming_compression.c
examples/streaming_decompression.c

index d1353a684a62eed2b8fd6e8880cd2be15af3f4ca..d0b04895f018fc020d2c63d1c03972e8874549bc 100644 (file)
@@ -44,8 +44,8 @@ static void compressFile_orDie(const char* fname, const char* outName, int cLeve
      * and writes all output produced to the output file.
      */
     size_t const toRead = buffInSize;
-    size_t read;
-    while ((read = fread_orDie(buffIn, toRead, fin))) {
+    for (;;) {
+        size_t read = fread_orDie(buffIn, toRead, fin);
         /* Select the flush mode.
          * If the read may not be finished (read == toRead) we use
          * ZSTD_e_continue. If this is the last chunk, we use ZSTD_e_end.
@@ -76,6 +76,10 @@ static void compressFile_orDie(const char* fname, const char* outName, int cLeve
         } while (!finished);
         CHECK(input.pos == input.size,
               "Impossible: zstd only returns 0 when the input is completely consumed!");
+
+        if (lastChunk) {
+            break;
+        }
     }
 
     ZSTD_freeCCtx(cctx);
index bcd861b756c1c8823b54edc3733be0ed60a62428..d26b45b34c74bc987f8f66dd201db9263da78030 100644 (file)
@@ -34,7 +34,10 @@ static void decompressFile_orDie(const char* fname)
      */
     size_t const toRead = buffInSize;
     size_t read;
+    size_t lastRet = 0;
+    int isEmpty = 1;
     while ( (read = fread_orDie(buffIn, toRead, fin)) ) {
+        isEmpty = 0;
         ZSTD_inBuffer input = { buffIn, read, 0 };
         /* Given a valid frame, zstd won't consume the last byte of the frame
          * until it has flushed all of the decompressed data of the frame.
@@ -53,9 +56,24 @@ static void decompressFile_orDie(const char* fname)
             size_t const ret = ZSTD_decompressStream(dctx, &output , &input);
             CHECK_ZSTD(ret);
             fwrite_orDie(buffOut, output.pos, fout);
+            lastRet = ret;
         }
     }
 
+    if (isEmpty) {
+        fprintf(stderr, "input is empty\n");
+        exit(1);
+    }
+
+    if (lastRet != 0) {
+        /* The last return value from ZSTD_decompressStream did not end on a
+         * frame, but we reached the end of the file! We assume this is an
+         * error, and the input was truncated.
+         */
+        fprintf(stderr, "EOF before end of stream: %zu\n", lastRet);
+        exit(1);
+    }
+
     ZSTD_freeDCtx(dctx);
     fclose_orDie(fin);
     fclose_orDie(fout);