From 2de34fa3f6d80cd03de6a4ac3c721571342e41c3 Mon Sep 17 00:00:00 2001 From: Alex Hultman Date: Sun, 12 Jan 2020 18:52:46 +0100 Subject: [PATCH] Stress more with MockedHelloWorld --- fuzzing/MockedHelloWorld.cpp | 21 +++++++++++++++++++++ fuzzing/uSocketsMock.c | 8 ++++++++ 2 files changed, 29 insertions(+) diff --git a/fuzzing/MockedHelloWorld.cpp b/fuzzing/MockedHelloWorld.cpp index f58fc59..1ac00f7 100644 --- a/fuzzing/MockedHelloWorld.cpp +++ b/fuzzing/MockedHelloWorld.cpp @@ -22,13 +22,34 @@ extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) { } }).post("/*", [](auto *res, auto *req) { res->onAborted([]() { + /* We might as well use this opportunity to stress the loop a bit */ + uWS::Loop::get()->defer([]() { + }); }); res->onData([res](std::string_view chunk, bool isEnd) { if (isEnd) { res->end(chunk); } }); + }).any("/:candy/*", [](auto *res, auto *req) { + if (req->getParameter(0).length() == 0) { + free((void *) -1); + } + /* Some invalid queries */ + req->getParameter(30000); + req->getParameter(-34234); + req->getHeader("yhello"); + req->getQuery(); + + /*req->onAborted([]() { + + });*/ + + /* As of now, this will be called immediately, but changes could make it properly deferred */ + uWS::Loop::get()->defer([res]() { + res->end("Deferred answer here"); + }); }).listen(9001, [](us_listen_socket_t *listenSocket) { if (listenSocket) { std::cout << "Listening on port " << 9001 << std::endl; diff --git a/fuzzing/uSocketsMock.c b/fuzzing/uSocketsMock.c index c04ddba..a52ed06 100644 --- a/fuzzing/uSocketsMock.c +++ b/fuzzing/uSocketsMock.c @@ -17,6 +17,8 @@ struct us_loop_t { /* Post and pre callbacks */ void (*pre_cb)(struct us_loop_t *loop); void (*post_cb)(struct us_loop_t *loop); + + void (*wakeup_cb)(struct us_loop_t *loop); }; struct us_loop_t *us_create_loop(void *hint, void (*wakeup_cb)(struct us_loop_t *loop), void (*pre_cb)(struct us_loop_t *loop), void (*post_cb)(struct us_loop_t *loop), unsigned int ext_size) { @@ -27,10 +29,16 @@ struct us_loop_t *us_create_loop(void *hint, void (*wakeup_cb)(struct us_loop_t loop->pre_cb = pre_cb; loop->post_cb = post_cb; + loop->wakeup_cb = wakeup_cb; return loop; } +void us_wakeup_loop(struct us_loop_t *loop) { + /* We do this immediately as of now, could be delayed to next iteration */ + loop->wakeup_cb(loop); +} + void us_loop_free(struct us_loop_t *loop) { free(loop); }