]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Fixing issues with double usage of data.
authorDario Pavlovic <dariop@fb.com>
Mon, 9 Sep 2019 22:39:04 +0000 (15:39 -0700)
committerDario Pavlovic <dariop@fb.com>
Mon, 9 Sep 2019 22:39:04 +0000 (15:39 -0700)
tests/fuzz/simple_decompress.c

index 56ebb93e6ecdcaa31b453125c535ed06397acebd..803f7f8652e523292e4a94ffdd5b7f8c019471b4 100644 (file)
@@ -23,23 +23,26 @@ static ZSTD_DCtx *dctx = NULL;
 
 int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
 {
+  FUZZ_dataProducer_t *producer = FUZZ_dataProducer_create(src, size);
 
-    FUZZ_dataProducer_t *producer = FUZZ_dataProducer_create(src, size);
-    int i;
-    if (!dctx) {
-        dctx = ZSTD_createDCtx();
-        FUZZ_ASSERT(dctx);
-    }
-    /* Run it 10 times over 10 output sizes. Reuse the context. */
-    for (i = 0; i < 10; ++i) {
-        size_t const bufSize = FUZZ_dataProducer_uint32Range(producer, 0, 2 * size);
-        void* rBuf = malloc(bufSize);
-        FUZZ_ASSERT(rBuf);
-        ZSTD_decompressDCtx(dctx, rBuf, bufSize, src, size);
-        free(rBuf);
-    }
-
-    FUZZ_dataProducer_free(producer);
+  int i;
+  if (!dctx) {
+      dctx = ZSTD_createDCtx();
+      FUZZ_ASSERT(dctx);
+  }
+
+  size_t const bufSize = FUZZ_dataProducer_uint32Range(producer, 0, 2 * size);
+  void* rBuf = malloc(bufSize);
+  FUZZ_ASSERT(rBuf);
+
+  /* Restrict to remaining data. If we run out of data while generating params,
+   we should still continue and let decompression happen on empty data. */
+  size = FUZZ_dataProducer_remainingBytes(producer);
+
+  ZSTD_decompressDCtx(dctx, rBuf, bufSize, src, size);
+  free(rBuf);
+
+  FUZZ_dataProducer_free(producer);
 
 #ifndef STATEFUL_FUZZING
     ZSTD_freeDCtx(dctx); dctx = NULL;