#include "App.h" #include "helpers.h" /* This function pushes data to the uSockets mock */ extern "C" void us_loop_read_mocked_data(struct us_loop *loop, char *data, unsigned int size); uWS::TemplatedApp *app; us_listen_socket_t *listenSocket; extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) { /* ws->getUserData returns one of these */ struct PerSocketData { int nothing; }; /* Very simple WebSocket echo server */ app = new uWS::TemplatedApp(uWS::App().ws("/*", { /* Settings */ .compression = uWS::SHARED_COMPRESSOR, /* We want this to be low so that we can hit it, yet bigger than 256 */ .maxPayloadLength = 300, .idleTimeout = 10, /* Handlers */ .open = [](auto *ws, auto *req) { /* Subscribe to anything */ ws->subscribe(req->getHeader("topic")); }, .message = [](auto *ws, std::string_view message, uWS::OpCode opCode) { if (message.length() && message[0] == 'C') { ws->close(); } else if (message.length() && message[0] == 'E') { ws->end(1006); } else { /* Publish to topic sent by message */ ws->publish(message, message, opCode, true); if (message.length() && message[0] == 'U') { ws->unsubscribe(message); } } }, .drain = [](auto *ws) { /* Check getBufferedAmount here */ }, .ping = [](auto *ws) { }, .pong = [](auto *ws) { }, .close = [](auto *ws, int code, std::string_view message) { /* Not necessary but we'll call it for coverage */ ws->unsubscribeAll(); } }).listen(9001, [](us_listen_socket_t *listenSocket) { if (listenSocket) { std::cout << "Listening on port " << 9001 << std::endl; ::listenSocket = listenSocket; } })); return 0; } extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { us_loop_read_mocked_data((struct us_loop *) uWS::Loop::get(), (char *) makePadded(data, size), size); return 0; }