huf_decompress.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /*
  2. * Copyright (c) Facebook, Inc.
  3. * All rights reserved.
  4. *
  5. * This source code is licensed under both the BSD-style license (found in the
  6. * LICENSE file in the root directory of this source tree) and the GPLv2 (found
  7. * in the COPYING file in the root directory of this source tree).
  8. * You may select, at your option, one of the above-listed licenses.
  9. */
  10. /**
  11. * This fuzz target performs a zstd round-trip test (compress & decompress),
  12. * compares the result with the original, and calls abort() on corruption.
  13. */
  14. #define HUF_STATIC_LINKING_ONLY
  15. #include <stddef.h>
  16. #include <stdlib.h>
  17. #include <stdio.h>
  18. #include <string.h>
  19. #include "common/cpu.h"
  20. #include "common/huf.h"
  21. #include "fuzz_helpers.h"
  22. #include "fuzz_data_producer.h"
  23. int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
  24. {
  25. FUZZ_dataProducer_t *producer = FUZZ_dataProducer_create(src, size);
  26. /* Select random parameters: #streams, X1 or X2 decoding, bmi2 */
  27. int const streams = FUZZ_dataProducer_int32Range(producer, 0, 1);
  28. int const symbols = FUZZ_dataProducer_int32Range(producer, 0, 1);
  29. int const bmi2 = ZSTD_cpuid_bmi2(ZSTD_cpuid()) && FUZZ_dataProducer_int32Range(producer, 0, 1);
  30. /* Select a random cBufSize - it may be too small */
  31. size_t const dBufSize = FUZZ_dataProducer_uint32Range(producer, 0, 8 * size + 500);
  32. size_t const maxTableLog = FUZZ_dataProducer_uint32Range(producer, 1, HUF_TABLELOG_MAX);
  33. HUF_DTable* dt = (HUF_DTable*)FUZZ_malloc(HUF_DTABLE_SIZE(maxTableLog) * sizeof(HUF_DTable));
  34. size_t const wkspSize = HUF_WORKSPACE_SIZE;
  35. void* wksp = FUZZ_malloc(wkspSize);
  36. void* dBuf = FUZZ_malloc(dBufSize);
  37. dt[0] = maxTableLog * 0x01000001;
  38. size = FUZZ_dataProducer_remainingBytes(producer);
  39. if (symbols == 0) {
  40. size_t const err = HUF_readDTableX1_wksp_bmi2(dt, src, size, wksp, wkspSize, bmi2);
  41. if (ZSTD_isError(err))
  42. goto _out;
  43. } else {
  44. size_t const err = HUF_readDTableX2_wksp_bmi2(dt, src, size, wksp, wkspSize, bmi2);
  45. if (ZSTD_isError(err))
  46. goto _out;
  47. }
  48. if (streams == 0)
  49. HUF_decompress1X_usingDTable_bmi2(dBuf, dBufSize, src, size, dt, bmi2);
  50. else
  51. HUF_decompress4X_usingDTable_bmi2(dBuf, dBufSize, src, size, dt, bmi2);
  52. _out:
  53. free(dt);
  54. free(wksp);
  55. free(dBuf);
  56. FUZZ_dataProducer_free(producer);
  57. return 0;
  58. }