Coverage Report

Created: 2025-11-13 06:53

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