Ignore chunks after early exit from httpParser

This commit is contained in:
Alex Hultman
2021-03-02 22:22:00 +01:00
parent ca6d4e3119
commit 0e932517fd
+16 -3
View File
@@ -87,7 +87,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
#endif #endif
/* Iterate the padded fuzz as chunks */ /* Iterate the padded fuzz as chunks */
makeChunked(makePadded(data, size), size, [&httpParser, user, reserved](const uint8_t *data, size_t size) { makeChunked(makePadded(data, size), size, [&httpParser, &user, reserved](const uint8_t *data, size_t size) {
/* We need at least 1 byte post padding */ /* We need at least 1 byte post padding */
if (size) { if (size) {
size--; size--;
@@ -96,8 +96,13 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
return; return;
} }
/* If user is null then ignore this chunk */
if (!user) {
return;
}
/* Parse it */ /* Parse it */
httpParser.consumePostPadded((char *) data, size, user, reserved, [reserved](void *s, uWS::HttpRequest *httpRequest) -> void * { void *returnedUser = httpParser.consumePostPadded((char *) data, size, user, reserved, [reserved](void *s, uWS::HttpRequest *httpRequest) -> void * {
readBytes(httpRequest->getHeader(httpRequest->getUrl())); readBytes(httpRequest->getHeader(httpRequest->getUrl()));
readBytes(httpRequest->getMethod()); readBytes(httpRequest->getMethod());
@@ -129,11 +134,19 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
/* Return ok */ /* Return ok */
return user; return user;
}, [](void *user) { }, [](void *user) -> void * {
/* Return break */ /* Return break */
return nullptr; return nullptr;
}); });
if (!returnedUser) {
/* It is of uttermost importance that if and when we return nullptr from the httpParser we must not
* ever use the httpParser ever again. It is in a broken state as returning nullptr is only used
* for signalling early closure. You must absolutely must throw it away. Here we just mark user as
* null so that we can ignore further chunks of data */
user = nullptr;
}
}); });
return 0; return 0;