/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 | 32.1k | static bool refusePayloadLength(uint64_t length, uWS::WebSocketState<true> *wState, void *s) { |
12 | | |
13 | | /* We need a limit */ |
14 | 32.1k | if (length > 16000) { |
15 | 633 | return true; |
16 | 633 | } |
17 | | |
18 | | /* Return ok */ |
19 | 31.5k | return false; |
20 | 32.1k | } |
21 | | |
22 | 7.56k | static bool setCompressed(uWS::WebSocketState<true> *wState, void *s) { |
23 | | /* We support it */ |
24 | 7.56k | return true; |
25 | 7.56k | } |
26 | | |
27 | 43.0k | static void forceClose(uWS::WebSocketState<true> *wState, void *s, std::string_view reason = {}) { |
28 | | |
29 | 43.0k | } |
30 | | |
31 | 40.5k | static bool handleFragment(char *data, size_t length, unsigned int remainingBytes, int opCode, bool fin, uWS::WebSocketState<true> *webSocketState, void *s) { |
32 | | |
33 | 40.5k | if (opCode == uWS::TEXT) { |
34 | 14.2k | if (!uWS::protocol::isValidUtf8((unsigned char *)data, length)) { |
35 | | /* Return break */ |
36 | 7.88k | return true; |
37 | 7.88k | } |
38 | 26.3k | } else if (opCode == uWS::CLOSE) { |
39 | 1.45k | uWS::protocol::parseClosePayload((char *)data, length); |
40 | 1.45k | } |
41 | | |
42 | | /* Return ok */ |
43 | 32.6k | return false; |
44 | 40.5k | } |
45 | | }; |
46 | | |
47 | 7.50k | extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { |
48 | | |
49 | | /* Create the parser state */ |
50 | 7.50k | uWS::WebSocketState<true> state; |
51 | | |
52 | 60.2k | makeChunked(makePadded(data, size), size, [&state](const uint8_t *data, size_t size) { |
53 | | /* Parse it */ |
54 | 60.2k | uWS::WebSocketProtocol<true, Impl>::consume((char *) data, size, &state, nullptr); |
55 | 60.2k | }); |
56 | | |
57 | 7.50k | return 0; |
58 | 7.50k | } |
59 | | |