deflate-ruby 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CLAUDE.md +138 -0
- data/LICENSE.txt +21 -0
- data/README.md +117 -0
- data/ext/deflate_ruby/deflate_ruby.c +301 -0
- data/ext/deflate_ruby/extconf.rb +34 -0
- data/ext/deflate_ruby/libdeflate/CMakeLists.txt +270 -0
- data/ext/deflate_ruby/libdeflate/COPYING +22 -0
- data/ext/deflate_ruby/libdeflate/NEWS.md +494 -0
- data/ext/deflate_ruby/libdeflate/README.md +228 -0
- data/ext/deflate_ruby/libdeflate/common_defs.h +747 -0
- data/ext/deflate_ruby/libdeflate/lib/adler32.c +162 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/adler32_impl.h +358 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/cpu_features.c +230 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/cpu_features.h +214 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/crc32_impl.h +600 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/crc32_pmull_helpers.h +156 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/crc32_pmull_wide.h +226 -0
- data/ext/deflate_ruby/libdeflate/lib/arm/matchfinder_impl.h +78 -0
- data/ext/deflate_ruby/libdeflate/lib/bt_matchfinder.h +342 -0
- data/ext/deflate_ruby/libdeflate/lib/cpu_features_common.h +93 -0
- data/ext/deflate_ruby/libdeflate/lib/crc32.c +262 -0
- data/ext/deflate_ruby/libdeflate/lib/crc32_multipliers.h +377 -0
- data/ext/deflate_ruby/libdeflate/lib/crc32_tables.h +587 -0
- data/ext/deflate_ruby/libdeflate/lib/decompress_template.h +777 -0
- data/ext/deflate_ruby/libdeflate/lib/deflate_compress.c +4129 -0
- data/ext/deflate_ruby/libdeflate/lib/deflate_compress.h +15 -0
- data/ext/deflate_ruby/libdeflate/lib/deflate_constants.h +56 -0
- data/ext/deflate_ruby/libdeflate/lib/deflate_decompress.c +1208 -0
- data/ext/deflate_ruby/libdeflate/lib/gzip_compress.c +90 -0
- data/ext/deflate_ruby/libdeflate/lib/gzip_constants.h +45 -0
- data/ext/deflate_ruby/libdeflate/lib/gzip_decompress.c +144 -0
- data/ext/deflate_ruby/libdeflate/lib/hc_matchfinder.h +401 -0
- data/ext/deflate_ruby/libdeflate/lib/ht_matchfinder.h +234 -0
- data/ext/deflate_ruby/libdeflate/lib/lib_common.h +106 -0
- data/ext/deflate_ruby/libdeflate/lib/matchfinder_common.h +224 -0
- data/ext/deflate_ruby/libdeflate/lib/riscv/matchfinder_impl.h +97 -0
- data/ext/deflate_ruby/libdeflate/lib/utils.c +141 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/adler32_impl.h +134 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/adler32_template.h +518 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/cpu_features.c +183 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/cpu_features.h +169 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/crc32_impl.h +160 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/crc32_pclmul_template.h +495 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/decompress_impl.h +57 -0
- data/ext/deflate_ruby/libdeflate/lib/x86/matchfinder_impl.h +122 -0
- data/ext/deflate_ruby/libdeflate/lib/zlib_compress.c +82 -0
- data/ext/deflate_ruby/libdeflate/lib/zlib_constants.h +21 -0
- data/ext/deflate_ruby/libdeflate/lib/zlib_decompress.c +104 -0
- data/ext/deflate_ruby/libdeflate/libdeflate-config.cmake.in +3 -0
- data/ext/deflate_ruby/libdeflate/libdeflate.h +411 -0
- data/ext/deflate_ruby/libdeflate/libdeflate.pc.in +18 -0
- data/ext/deflate_ruby/libdeflate/programs/CMakeLists.txt +105 -0
- data/ext/deflate_ruby/libdeflate/programs/benchmark.c +696 -0
- data/ext/deflate_ruby/libdeflate/programs/checksum.c +218 -0
- data/ext/deflate_ruby/libdeflate/programs/config.h.in +19 -0
- data/ext/deflate_ruby/libdeflate/programs/gzip.c +688 -0
- data/ext/deflate_ruby/libdeflate/programs/prog_util.c +521 -0
- data/ext/deflate_ruby/libdeflate/programs/prog_util.h +225 -0
- data/ext/deflate_ruby/libdeflate/programs/test_checksums.c +200 -0
- data/ext/deflate_ruby/libdeflate/programs/test_custom_malloc.c +155 -0
- data/ext/deflate_ruby/libdeflate/programs/test_incomplete_codes.c +385 -0
- data/ext/deflate_ruby/libdeflate/programs/test_invalid_streams.c +130 -0
- data/ext/deflate_ruby/libdeflate/programs/test_litrunlen_overflow.c +72 -0
- data/ext/deflate_ruby/libdeflate/programs/test_overread.c +95 -0
- data/ext/deflate_ruby/libdeflate/programs/test_slow_decompression.c +472 -0
- data/ext/deflate_ruby/libdeflate/programs/test_trailing_bytes.c +151 -0
- data/ext/deflate_ruby/libdeflate/programs/test_util.c +237 -0
- data/ext/deflate_ruby/libdeflate/programs/test_util.h +61 -0
- data/ext/deflate_ruby/libdeflate/programs/tgetopt.c +118 -0
- data/ext/deflate_ruby/libdeflate/scripts/android_build.sh +118 -0
- data/ext/deflate_ruby/libdeflate/scripts/android_tests.sh +69 -0
- data/ext/deflate_ruby/libdeflate/scripts/benchmark.sh +10 -0
- data/ext/deflate_ruby/libdeflate/scripts/checksum.sh +10 -0
- data/ext/deflate_ruby/libdeflate/scripts/checksum_benchmarks.sh +253 -0
- data/ext/deflate_ruby/libdeflate/scripts/cmake-helper.sh +17 -0
- data/ext/deflate_ruby/libdeflate/scripts/deflate_benchmarks.sh +119 -0
- data/ext/deflate_ruby/libdeflate/scripts/exec_tests.sh +38 -0
- data/ext/deflate_ruby/libdeflate/scripts/gen-release-archives.sh +37 -0
- data/ext/deflate_ruby/libdeflate/scripts/gen_bitreverse_tab.py +19 -0
- data/ext/deflate_ruby/libdeflate/scripts/gen_crc32_multipliers.c +199 -0
- data/ext/deflate_ruby/libdeflate/scripts/gen_crc32_tables.c +105 -0
- data/ext/deflate_ruby/libdeflate/scripts/gen_default_litlen_costs.py +44 -0
- data/ext/deflate_ruby/libdeflate/scripts/gen_offset_slot_map.py +29 -0
- data/ext/deflate_ruby/libdeflate/scripts/gzip_tests.sh +523 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/deflate_compress/corpus/0 +0 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/deflate_compress/fuzz.c +95 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/deflate_decompress/corpus/0 +3 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/deflate_decompress/fuzz.c +62 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/fuzz.sh +108 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/gzip_decompress/corpus/0 +0 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/gzip_decompress/fuzz.c +19 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/zlib_decompress/corpus/0 +3 -0
- data/ext/deflate_ruby/libdeflate/scripts/libFuzzer/zlib_decompress/fuzz.c +19 -0
- data/ext/deflate_ruby/libdeflate/scripts/run_tests.sh +416 -0
- data/ext/deflate_ruby/libdeflate/scripts/toolchain-i686-w64-mingw32.cmake +8 -0
- data/ext/deflate_ruby/libdeflate/scripts/toolchain-x86_64-w64-mingw32.cmake +8 -0
- data/lib/deflate_ruby/version.rb +5 -0
- data/lib/deflate_ruby.rb +71 -0
- metadata +191 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#include <assert.h>
|
|
2
|
+
#include <libdeflate.h>
|
|
3
|
+
#include <stdbool.h>
|
|
4
|
+
#include <stdint.h>
|
|
5
|
+
#include <stdlib.h>
|
|
6
|
+
#include <string.h>
|
|
7
|
+
#include <sys/mman.h>
|
|
8
|
+
#include <unistd.h>
|
|
9
|
+
|
|
10
|
+
static void
|
|
11
|
+
alloc_guarded_buffer(size_t size, uint8_t **start_ret, uint8_t **end_ret)
|
|
12
|
+
{
|
|
13
|
+
const size_t pagesize = sysconf(_SC_PAGESIZE);
|
|
14
|
+
const size_t nr_pages = (size + pagesize - 1) / pagesize;
|
|
15
|
+
uint8_t *base_addr, *start, *end;
|
|
16
|
+
|
|
17
|
+
/* Allocate buffer and guard pages. */
|
|
18
|
+
base_addr = mmap(NULL, (nr_pages + 2) * pagesize, PROT_READ|PROT_WRITE,
|
|
19
|
+
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
|
20
|
+
assert(base_addr != (uint8_t *)MAP_FAILED);
|
|
21
|
+
start = base_addr + pagesize;
|
|
22
|
+
end = start + (nr_pages * pagesize);
|
|
23
|
+
|
|
24
|
+
/* Unmap the guard pages. */
|
|
25
|
+
munmap(base_addr, pagesize);
|
|
26
|
+
munmap(end, pagesize);
|
|
27
|
+
|
|
28
|
+
*start_ret = start;
|
|
29
|
+
*end_ret = end;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static void
|
|
33
|
+
free_guarded_buffer(uint8_t *start, uint8_t *end)
|
|
34
|
+
{
|
|
35
|
+
munmap(start, end - start);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Fuzz the DEFLATE compression and decompression round trip. */
|
|
39
|
+
int LLVMFuzzerTestOneInput(const uint8_t *in, size_t insize)
|
|
40
|
+
{
|
|
41
|
+
int level;
|
|
42
|
+
bool use_bound;
|
|
43
|
+
struct libdeflate_compressor *c;
|
|
44
|
+
struct libdeflate_decompressor *d;
|
|
45
|
+
size_t csize_avail;
|
|
46
|
+
uint8_t *ubuf_start, *ubuf_end, *ubuf;
|
|
47
|
+
uint8_t *cbuf_start, *cbuf_end, *cbuf;
|
|
48
|
+
uint8_t *dbuf_start, *dbuf_end, *dbuf;
|
|
49
|
+
size_t csize;
|
|
50
|
+
enum libdeflate_result res;
|
|
51
|
+
|
|
52
|
+
if (insize < 2)
|
|
53
|
+
return 0;
|
|
54
|
+
|
|
55
|
+
level = in[0] % 13;
|
|
56
|
+
use_bound = in[1] % 2;
|
|
57
|
+
in += 2;
|
|
58
|
+
insize -= 2;
|
|
59
|
+
|
|
60
|
+
c = libdeflate_alloc_compressor(level);
|
|
61
|
+
d = libdeflate_alloc_decompressor();
|
|
62
|
+
|
|
63
|
+
/* Use guard pages to make all input/output buffer overflows segfault */
|
|
64
|
+
|
|
65
|
+
alloc_guarded_buffer(insize, &ubuf_start, &ubuf_end);
|
|
66
|
+
ubuf = ubuf_end - insize;
|
|
67
|
+
memcpy(ubuf, in, insize);
|
|
68
|
+
|
|
69
|
+
csize_avail = use_bound ? libdeflate_deflate_compress_bound(c, insize) :
|
|
70
|
+
insize;
|
|
71
|
+
alloc_guarded_buffer(csize_avail, &cbuf_start, &cbuf_end);
|
|
72
|
+
cbuf = cbuf_end - csize_avail;
|
|
73
|
+
|
|
74
|
+
alloc_guarded_buffer(insize, &dbuf_start, &dbuf_end);
|
|
75
|
+
dbuf = dbuf_end - insize;
|
|
76
|
+
|
|
77
|
+
csize = libdeflate_deflate_compress(c, ubuf, insize, cbuf, csize_avail);
|
|
78
|
+
if (csize != 0) {
|
|
79
|
+
assert(csize <= csize_avail);
|
|
80
|
+
memmove(cbuf_end - csize, cbuf, csize);
|
|
81
|
+
res = libdeflate_deflate_decompress(d, cbuf_end - csize, csize,
|
|
82
|
+
dbuf, insize, NULL);
|
|
83
|
+
assert(res == LIBDEFLATE_SUCCESS);
|
|
84
|
+
assert(memcmp(in, dbuf, insize) == 0);
|
|
85
|
+
} else {
|
|
86
|
+
assert(!use_bound);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
libdeflate_free_compressor(c);
|
|
90
|
+
libdeflate_free_decompressor(d);
|
|
91
|
+
free_guarded_buffer(ubuf_start, ubuf_end);
|
|
92
|
+
free_guarded_buffer(cbuf_start, cbuf_end);
|
|
93
|
+
free_guarded_buffer(dbuf_start, dbuf_end);
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#include <assert.h>
|
|
2
|
+
#include <libdeflate.h>
|
|
3
|
+
#include <stdbool.h>
|
|
4
|
+
#include <stdint.h>
|
|
5
|
+
#include <stdlib.h>
|
|
6
|
+
#include <string.h>
|
|
7
|
+
#include <sys/mman.h>
|
|
8
|
+
#include <unistd.h>
|
|
9
|
+
|
|
10
|
+
static void
|
|
11
|
+
alloc_guarded_buffer(size_t size, uint8_t **start_ret, uint8_t **end_ret)
|
|
12
|
+
{
|
|
13
|
+
const size_t pagesize = sysconf(_SC_PAGESIZE);
|
|
14
|
+
const size_t nr_pages = (size + pagesize - 1) / pagesize;
|
|
15
|
+
uint8_t *base_addr, *start, *end;
|
|
16
|
+
|
|
17
|
+
/* Allocate buffer and guard pages. */
|
|
18
|
+
base_addr = mmap(NULL, (nr_pages + 2) * pagesize, PROT_READ|PROT_WRITE,
|
|
19
|
+
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
|
20
|
+
assert(base_addr != (uint8_t *)MAP_FAILED);
|
|
21
|
+
start = base_addr + pagesize;
|
|
22
|
+
end = start + (nr_pages * pagesize);
|
|
23
|
+
|
|
24
|
+
/* Unmap the guard pages. */
|
|
25
|
+
munmap(base_addr, pagesize);
|
|
26
|
+
munmap(end, pagesize);
|
|
27
|
+
|
|
28
|
+
*start_ret = start;
|
|
29
|
+
*end_ret = end;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static void
|
|
33
|
+
free_guarded_buffer(uint8_t *start, uint8_t *end)
|
|
34
|
+
{
|
|
35
|
+
munmap(start, end - start);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Fuzz DEFLATE decompression. */
|
|
39
|
+
int LLVMFuzzerTestOneInput(const uint8_t *in, size_t insize)
|
|
40
|
+
{
|
|
41
|
+
size_t outsize_avail = 3 * insize;
|
|
42
|
+
uint8_t *cbuf_start, *cbuf_end, *cbuf;
|
|
43
|
+
uint8_t *dbuf_start, *dbuf_end, *dbuf;
|
|
44
|
+
struct libdeflate_decompressor *d;
|
|
45
|
+
|
|
46
|
+
/* Use guard pages to make all input/output buffer overflows segfault */
|
|
47
|
+
|
|
48
|
+
alloc_guarded_buffer(insize, &cbuf_start, &cbuf_end);
|
|
49
|
+
cbuf = cbuf_end - insize;
|
|
50
|
+
memcpy(cbuf, in, insize);
|
|
51
|
+
|
|
52
|
+
alloc_guarded_buffer(outsize_avail, &dbuf_start, &dbuf_end);
|
|
53
|
+
dbuf = dbuf_end - outsize_avail;
|
|
54
|
+
|
|
55
|
+
d = libdeflate_alloc_decompressor();
|
|
56
|
+
libdeflate_deflate_decompress(d, cbuf, insize, dbuf, outsize_avail,
|
|
57
|
+
NULL);
|
|
58
|
+
libdeflate_free_decompressor(d);
|
|
59
|
+
free_guarded_buffer(cbuf_start, cbuf_end);
|
|
60
|
+
free_guarded_buffer(dbuf_start, dbuf_end);
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
set -e -u -o pipefail
|
|
4
|
+
|
|
5
|
+
cd "$(dirname "$0")"
|
|
6
|
+
|
|
7
|
+
read -r -a AVAILABLE_TARGETS < <(echo */fuzz.c | sed 's@/fuzz.c@@g')
|
|
8
|
+
|
|
9
|
+
usage()
|
|
10
|
+
{
|
|
11
|
+
cat << EOF
|
|
12
|
+
Usage: $0 [OPTION]... FUZZ_TARGET
|
|
13
|
+
|
|
14
|
+
Fuzz libdeflate with LLVM's libFuzzer.
|
|
15
|
+
|
|
16
|
+
Options:
|
|
17
|
+
--asan Enable AddressSanitizer
|
|
18
|
+
--max-len=LEN Maximum length of generated inputs (default: $MAX_LEN)
|
|
19
|
+
--msan Enable MemorySanitizer
|
|
20
|
+
--time=SECONDS Stop after the given time has passed
|
|
21
|
+
--ubsan Enable UndefinedBehaviorSanitizer
|
|
22
|
+
|
|
23
|
+
Available fuzz targets: ${AVAILABLE_TARGETS[*]}
|
|
24
|
+
EOF
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
die()
|
|
28
|
+
{
|
|
29
|
+
echo "$*" 1>&2
|
|
30
|
+
exit 1
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
run_cmd()
|
|
34
|
+
{
|
|
35
|
+
echo "$*"
|
|
36
|
+
"$@"
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
EXTRA_SANITIZERS=
|
|
40
|
+
EXTRA_FUZZER_ARGS=()
|
|
41
|
+
MAX_LEN=65536
|
|
42
|
+
|
|
43
|
+
longopts_array=(
|
|
44
|
+
asan
|
|
45
|
+
help
|
|
46
|
+
max-len:
|
|
47
|
+
msan
|
|
48
|
+
time:
|
|
49
|
+
ubsan
|
|
50
|
+
)
|
|
51
|
+
longopts=$(echo "${longopts_array[@]}" | tr ' ' ',')
|
|
52
|
+
|
|
53
|
+
if ! options=$(getopt -o "" -l "$longopts" -- "$@"); then
|
|
54
|
+
usage 1>&2
|
|
55
|
+
exit 1
|
|
56
|
+
fi
|
|
57
|
+
eval set -- "$options"
|
|
58
|
+
while true; do
|
|
59
|
+
case "$1" in
|
|
60
|
+
--asan)
|
|
61
|
+
EXTRA_SANITIZERS+=",address"
|
|
62
|
+
;;
|
|
63
|
+
--help)
|
|
64
|
+
usage
|
|
65
|
+
exit 0
|
|
66
|
+
;;
|
|
67
|
+
--max-len)
|
|
68
|
+
MAX_LEN=$2
|
|
69
|
+
shift
|
|
70
|
+
;;
|
|
71
|
+
--msan)
|
|
72
|
+
EXTRA_SANITIZERS+=",memory"
|
|
73
|
+
;;
|
|
74
|
+
--time)
|
|
75
|
+
EXTRA_FUZZER_ARGS+=("-max_total_time=$2")
|
|
76
|
+
shift
|
|
77
|
+
;;
|
|
78
|
+
--ubsan)
|
|
79
|
+
EXTRA_SANITIZERS+=",undefined"
|
|
80
|
+
;;
|
|
81
|
+
--)
|
|
82
|
+
shift
|
|
83
|
+
break
|
|
84
|
+
;;
|
|
85
|
+
*)
|
|
86
|
+
echo 1>&2 "Invalid option '$1'"
|
|
87
|
+
usage 1>&2
|
|
88
|
+
exit 1
|
|
89
|
+
esac
|
|
90
|
+
shift
|
|
91
|
+
done
|
|
92
|
+
EXTRA_FUZZER_ARGS+=("-max_len=$MAX_LEN")
|
|
93
|
+
|
|
94
|
+
if (( $# != 1 )); then
|
|
95
|
+
echo 1>&2 "No fuzz target specified!"
|
|
96
|
+
usage 1>&2
|
|
97
|
+
exit 1
|
|
98
|
+
fi
|
|
99
|
+
TARGET=$1
|
|
100
|
+
if [ ! -e "$TARGET/fuzz.c" ]; then
|
|
101
|
+
echo 1>&2 "'$TARGET' is not a valid fuzz target!"
|
|
102
|
+
usage 1>&2
|
|
103
|
+
exit 1
|
|
104
|
+
fi
|
|
105
|
+
run_cmd clang -g -O1 -fsanitize=fuzzer$EXTRA_SANITIZERS \
|
|
106
|
+
-Wall -Werror -DLIBDEFLATE_ENABLE_ASSERTIONS=1 -I ../../ \
|
|
107
|
+
../../lib/*{,/*}.c "$TARGET/fuzz.c" -o "$TARGET/fuzz"
|
|
108
|
+
run_cmd "$TARGET/fuzz" "${EXTRA_FUZZER_ARGS[@]}" "$TARGET/corpus"
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#include <libdeflate.h>
|
|
2
|
+
#include <stdint.h>
|
|
3
|
+
#include <stdlib.h>
|
|
4
|
+
|
|
5
|
+
/* Fuzz gzip decompression. */
|
|
6
|
+
int LLVMFuzzerTestOneInput(const uint8_t *in, size_t insize)
|
|
7
|
+
{
|
|
8
|
+
size_t outsize_avail = 3 * insize;
|
|
9
|
+
uint8_t *out;
|
|
10
|
+
struct libdeflate_decompressor *d;
|
|
11
|
+
|
|
12
|
+
out = malloc(outsize_avail);
|
|
13
|
+
|
|
14
|
+
d = libdeflate_alloc_decompressor();
|
|
15
|
+
libdeflate_gzip_decompress(d, in, insize, out, outsize_avail, NULL);
|
|
16
|
+
libdeflate_free_decompressor(d);
|
|
17
|
+
free(out);
|
|
18
|
+
return 0;
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#include <libdeflate.h>
|
|
2
|
+
#include <stdint.h>
|
|
3
|
+
#include <stdlib.h>
|
|
4
|
+
|
|
5
|
+
/* Fuzz zlib decompression. */
|
|
6
|
+
int LLVMFuzzerTestOneInput(const uint8_t *in, size_t insize)
|
|
7
|
+
{
|
|
8
|
+
size_t outsize_avail = 3 * insize;
|
|
9
|
+
uint8_t *out;
|
|
10
|
+
struct libdeflate_decompressor *d;
|
|
11
|
+
|
|
12
|
+
out = malloc(outsize_avail);
|
|
13
|
+
|
|
14
|
+
d = libdeflate_alloc_decompressor();
|
|
15
|
+
libdeflate_zlib_decompress(d, in, insize, out, outsize_avail, NULL);
|
|
16
|
+
libdeflate_free_decompressor(d);
|
|
17
|
+
free(out);
|
|
18
|
+
return 0;
|
|
19
|
+
}
|