Coverage Report

Created: 2026-09-04 06:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/zlib-ng/test/fuzz/fuzzer_example_small.c
Line
Count
Source
1
#include "zbuild.h"
2
#include <assert.h>
3
#ifdef ZLIB_COMPAT
4
#  include "zlib.h"
5
#else
6
#  include "zlib-ng.h"
7
#endif
8
9
408M
#define CHECK_ERR(err, msg) { \
10
408M
    if (err != Z_OK) { \
11
0
        fprintf(stderr, "%s error: %d\n", msg, err); \
12
0
        exit(1); \
13
0
    } \
14
408M
}
15
16
static const uint8_t *data;
17
static size_t dataLen;
18
static alloc_func zalloc = NULL;
19
static free_func zfree = NULL;
20
21
/* ===========================================================================
22
 * Test deflate() with small buffers
23
 */
24
3.73k
void test_deflate(unsigned char *compr, size_t comprLen) {
25
3.73k
    PREFIX3(stream) c_stream; /* compression stream */
26
3.73k
    int err;
27
3.73k
    unsigned long len = (unsigned long)dataLen;
28
29
3.73k
    c_stream.zalloc = zalloc;
30
3.73k
    c_stream.zfree = zfree;
31
3.73k
    c_stream.opaque = (void *)0;
32
33
3.73k
    err = PREFIX(deflateInit)(&c_stream, Z_DEFAULT_COMPRESSION);
34
3.73k
    CHECK_ERR(err, "deflateInit");
35
36
3.73k
    c_stream.next_in = (z_const unsigned char *)data;
37
3.73k
    c_stream.next_out = compr;
38
39
250M
    while (c_stream.total_in != len && c_stream.total_out < comprLen) {
40
250M
        c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
41
250M
        err = PREFIX(deflate)(&c_stream, Z_NO_FLUSH);
42
250M
        CHECK_ERR(err, "deflate small 1");
43
250M
    }
44
    /* Finish the stream, still forcing small buffers: */
45
9.00M
    for (;;) {
46
9.00M
        c_stream.avail_out = 1;
47
9.00M
        err = PREFIX(deflate)(&c_stream, Z_FINISH);
48
9.00M
        if (err == Z_STREAM_END)
49
3.73k
            break;
50
9.00M
        CHECK_ERR(err, "deflate small 2");
51
9.00M
    }
52
53
3.73k
    err = PREFIX(deflateEnd)(&c_stream);
54
3.73k
    CHECK_ERR(err, "deflateEnd");
55
3.73k
}
56
57
/* ===========================================================================
58
 * Test inflate() with small buffers
59
 */
60
3.73k
void test_inflate(unsigned char *compr, size_t comprLen, unsigned char *uncompr, size_t uncomprLen) {
61
3.73k
    int err;
62
3.73k
    PREFIX3(stream) d_stream; /* decompression stream */
63
64
3.73k
    d_stream.zalloc = zalloc;
65
3.73k
    d_stream.zfree = zfree;
66
3.73k
    d_stream.opaque = (void *)0;
67
68
3.73k
    d_stream.next_in = compr;
69
3.73k
    d_stream.avail_in = 0;
70
3.73k
    d_stream.next_out = uncompr;
71
72
3.73k
    err = PREFIX(inflateInit)(&d_stream);
73
3.73k
    CHECK_ERR(err, "inflateInit");
74
75
148M
    while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
76
148M
        d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
77
148M
        err = PREFIX(inflate)(&d_stream, Z_NO_FLUSH);
78
148M
        if (err == Z_STREAM_END)
79
0
            break;
80
148M
        CHECK_ERR(err, "inflate");
81
148M
    }
82
83
3.73k
    err = PREFIX(inflateEnd)(&d_stream);
84
3.73k
    CHECK_ERR(err, "inflateEnd");
85
86
3.73k
    if (memcmp(uncompr, data, dataLen)) {
87
0
        fprintf(stderr, "bad inflate\n");
88
0
        exit(1);
89
0
    }
90
3.73k
}
91
92
11.4k
int LLVMFuzzerTestOneInput(const uint8_t *d, size_t size) {
93
11.4k
    size_t comprLen = PREFIX(compressBound)((z_uintmax_t)size);
94
11.4k
    size_t uncomprLen = size;
95
11.4k
    uint8_t *compr, *uncompr;
96
97
    /* Discard inputs larger than 1Mb. */
98
11.4k
    static size_t kMaxSize = 1024 * 1024;
99
100
11.4k
    if (size < 1 || size > kMaxSize)
101
4
        return 0;
102
103
11.4k
    data = d;
104
11.4k
    dataLen = size;
105
11.4k
    compr = (uint8_t *)calloc(1, comprLen);
106
11.4k
    uncompr = (uint8_t *)calloc(1, uncomprLen);
107
108
11.4k
    test_deflate(compr, comprLen);
109
11.4k
    test_inflate(compr, comprLen, uncompr, uncomprLen);
110
111
11.4k
    free(compr);
112
11.4k
    free(uncompr);
113
114
    /* This function must return 0. */
115
11.4k
    return 0;
116
11.4k
}