Coverage Report

Created: 2026-06-15 06:50

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/uWebSockets/fuzzing/PerMessageDeflate.cpp
Line
Count
Source
1
/* This is a fuzz test of the permessage-deflate module */
2
3
#define WIN32_EXPORT
4
5
#include <cstdio>
6
#include <string>
7
#include <bitset>
8
9
/* We test the permessage deflate module */
10
#include "../src/PerMessageDeflate.h"
11
12
#include "helpers.h"
13
14
154
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
15
16
    /* First byte determines what compressor to use */
17
154
    if (size >= 1) {
18
19
154
        uWS::CompressOptions compressors[] = {
20
154
            uWS::DEDICATED_COMPRESSOR_3KB,
21
154
            uWS::DEDICATED_COMPRESSOR_4KB,
22
154
            uWS::DEDICATED_COMPRESSOR_8KB,
23
154
            uWS::DEDICATED_COMPRESSOR_16KB,
24
154
            uWS::DEDICATED_COMPRESSOR_32KB,
25
154
            uWS::DEDICATED_COMPRESSOR_64KB,
26
154
            uWS::DEDICATED_COMPRESSOR_128KB,
27
154
            uWS::DEDICATED_COMPRESSOR_256KB
28
154
        };
29
30
154
        auto compressor = compressors[data[0] % 8];
31
154
        data++;
32
154
        size--;
33
34
        /* Bits 0 - 256 are okay */
35
154
        std::bitset<257> b;
36
37
        /* If we could specify LARGE_BUFFER_SIZE small here we could force it to inflate in chunks,
38
        * triggering more line coverage. Currently it is set to 16kb which is always too much */
39
154
        struct StaticData {
40
154
            uWS::DeflationStream deflationStream;
41
154
            uWS::InflationStream inflationStream;
42
154
            uWS::ZlibContext zlibContext;
43
154
        } staticData = {compressor, compressor};
44
45
        /* Why is this padded? */
46
22.3k
        makeChunked(makePadded(data, size), size, [&staticData, &b](const uint8_t *data, size_t size) {
47
22.3k
            auto inflation = staticData.inflationStream.inflate(&staticData.zlibContext, std::string_view((char *) data, size), 256, true);
48
49
            /* Trigger ASAN flaws if length is more than 256 */
50
22.3k
            if (inflation.has_value()) {
51
22.3k
                b.set(inflation->length());
52
22.3k
            }
53
22.3k
        });
54
55
22.3k
        makeChunked(makePadded(data, size), size, [&staticData](const uint8_t *data, size_t size) {
56
            /* Always reset */
57
22.3k
            staticData.deflationStream.deflate(&staticData.zlibContext, std::string_view((char *) data, size), true);
58
22.3k
        });
59
60
154
    }
61
62
154
    return 0;
63
154
}
64