From 44af0e571031d9ff9ced76e6b9dbe921ec4aa247 Mon Sep 17 00:00:00 2001 From: Alex Hultman Date: Wed, 20 Apr 2022 13:13:12 +0200 Subject: [PATCH] Fix HttpParser/MessageParser for bytes above 7-bit ASCII --- src/HttpParser.h | 4 ++-- src/MessageParser.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/HttpParser.h b/src/HttpParser.h index 277b613..4209775 100644 --- a/src/HttpParser.h +++ b/src/HttpParser.h @@ -191,7 +191,7 @@ private: * which is then removed, and our counters to flip due to overflow and we end up with a crash */ for (unsigned int i = 0; i < HttpRequest::MAX_HEADERS; i++) { - for (preliminaryKey = postPaddedBuffer; (*postPaddedBuffer != ':') & (*postPaddedBuffer > 32); *(postPaddedBuffer++) |= 32); + for (preliminaryKey = postPaddedBuffer; (*postPaddedBuffer != ':') & (*(unsigned char *)postPaddedBuffer > 32); *(postPaddedBuffer++) |= 32); if (*postPaddedBuffer == '\r') { if ((postPaddedBuffer != end) & (postPaddedBuffer[1] == '\n') & (i > 0)) { headers->key = std::string_view(nullptr, 0); @@ -201,7 +201,7 @@ private: } } else { headers->key = std::string_view(preliminaryKey, (size_t) (postPaddedBuffer - preliminaryKey)); - for (postPaddedBuffer++; (*postPaddedBuffer == ':' || *postPaddedBuffer < 33) && *postPaddedBuffer != '\r'; postPaddedBuffer++); + for (postPaddedBuffer++; (*postPaddedBuffer == ':' || *(unsigned char *)postPaddedBuffer < 33) && *postPaddedBuffer != '\r'; postPaddedBuffer++); preliminaryValue = postPaddedBuffer; postPaddedBuffer = (char *) memchr(postPaddedBuffer, '\r', (size_t) (end - postPaddedBuffer)); if (postPaddedBuffer && postPaddedBuffer[1] == '\n') { diff --git a/src/MessageParser.h b/src/MessageParser.h index aa8d455..d418d28 100644 --- a/src/MessageParser.h +++ b/src/MessageParser.h @@ -34,7 +34,7 @@ namespace uWS { char *preliminaryKey, *preliminaryValue, *start = postPaddedBuffer; for (unsigned int i = 0; i < MAX_HEADERS; i++) { - for (preliminaryKey = postPaddedBuffer; (*postPaddedBuffer != ':') & (*postPaddedBuffer > 32); *(postPaddedBuffer++) |= 32); + for (preliminaryKey = postPaddedBuffer; (*postPaddedBuffer != ':') & (*(unsigned char *)postPaddedBuffer > 32); *(postPaddedBuffer++) |= 32); if (*postPaddedBuffer == '\r') { if ((postPaddedBuffer != end) & (postPaddedBuffer[1] == '\n') /* & (i > 0) */) { // multipart does not require any headers like http does headers->first = std::string_view(nullptr, 0); @@ -44,7 +44,7 @@ namespace uWS { } } else { headers->first = std::string_view(preliminaryKey, (size_t) (postPaddedBuffer - preliminaryKey)); - for (postPaddedBuffer++; (*postPaddedBuffer == ':' || *postPaddedBuffer < 33) && *postPaddedBuffer != '\r'; postPaddedBuffer++); + for (postPaddedBuffer++; (*postPaddedBuffer == ':' || *(unsigned char *)postPaddedBuffer < 33) && *postPaddedBuffer != '\r'; postPaddedBuffer++); preliminaryValue = postPaddedBuffer; postPaddedBuffer = (char *) memchr(postPaddedBuffer, '\r', end - postPaddedBuffer); if (postPaddedBuffer && postPaddedBuffer[1] == '\n') {