Coverage Report

Created: 2025-12-05 06:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/uWebSockets/fuzzing/WebSocket.cpp
Line
Count
Source
1
/* This is a fuzz test of the websocket parser */
2
3
#define WIN32_EXPORT
4
5
#include "helpers.h"
6
7
/* We test the websocket parser */
8
#include "../src/WebSocketProtocol.h"
9
10
struct Impl {
11
62.1k
    static bool refusePayloadLength(uint64_t length, uWS::WebSocketState<true> *wState, void *s) {
12
13
        /* We need a limit */
14
62.1k
        if (length > 16000) {
15
587
            return true;
16
587
        }
17
18
        /* Return ok */
19
61.6k
        return false;
20
62.1k
    }
21
22
37.6k
    static bool setCompressed(uWS::WebSocketState<true> *wState, void *s) {
23
        /* We support it */
24
37.6k
        return true;
25
37.6k
    }
26
27
158k
    static void forceClose(uWS::WebSocketState<true> *wState, void *s, std::string_view reason = {}) {
28
29
158k
    }
30
31
78.5k
    static bool handleFragment(char *data, size_t length, unsigned int remainingBytes, int opCode, bool fin, uWS::WebSocketState<true> *webSocketState, void *s) {
32
33
78.5k
        if (opCode == uWS::TEXT) {
34
23.4k
            if (!uWS::protocol::isValidUtf8((unsigned char *)data, length)) {
35
                /* Return break */
36
9.78k
                return true;
37
9.78k
            }
38
55.0k
        } else if (opCode == uWS::CLOSE) {
39
41.7k
            uWS::protocol::parseClosePayload((char *)data, length);
40
41.7k
        }
41
42
        /* Return ok */
43
68.7k
        return false;
44
78.5k
    }
45
};
46
47
8.14k
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
48
49
    /* Create the parser state */
50
8.14k
    uWS::WebSocketState<true> state;
51
52
184k
    makeChunked(makePadded(data, size), size, [&state](const uint8_t *data, size_t size) {
53
        /* Parse it */
54
184k
        uWS::WebSocketProtocol<true, Impl>::consume((char *) data, size, &state, nullptr);
55
184k
    });
56
57
8.14k
    return 0;
58
8.14k
}
59