From 9e94f22bce16995b84a2e46299b901e6f1d77f29 Mon Sep 17 00:00:00 2001 From: gb-123-git <64229388+gb-123-git@users.noreply.github.com> Date: Fri, 18 Aug 2023 06:21:13 +0530 Subject: [PATCH] Fix infinite loop when the buffer ends with \r #123 (#2) * Fix infinite loop when the buffer ends with \r * Properly check for end of line across buffers --------- Co-authored-by: vvigilante --- src/HTTPConnection.cpp | 30 ++++++++++++++---------------- src/HTTPConnection.hpp | 2 ++ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/HTTPConnection.cpp b/src/HTTPConnection.cpp index 33c928d..17452e0 100644 --- a/src/HTTPConnection.cpp +++ b/src/HTTPConnection.cpp @@ -290,26 +290,24 @@ void HTTPConnection::raiseError(uint16_t code, std::string reason) { void HTTPConnection::readLine(int lengthLimit) { while(_bufferProcessed < _bufferUnusedIdx) { char newChar = _receiveBuffer[_bufferProcessed]; - - if ( newChar == '\r') { - // Look ahead for \n (if not possible, wait for next round - if (_bufferProcessed+1 < _bufferUnusedIdx) { - if (_receiveBuffer[_bufferProcessed+1] == '\n') { - _bufferProcessed += 2; - _parserLine.parsingFinished = true; - return; - } else { - // Line has not been terminated by \r\n - HTTPS_LOGW("Line without \\r\\n (got only \\r). FID=%d", _socket); - raiseError(400, "Bad Request"); - return; - } + _bufferProcessed++; + if ( partialTerminationParsed ){ + partialTerminationParsed = false; + if (newChar == '\n') { + _parserLine.parsingFinished = true; + } else { + // Line has not been terminated by \r\n + HTTPS_LOGW("Line without \\r\\n (got only \\r). FID=%d", _socket); + raiseError(400, "Bad Request"); } + return; + } + if ( newChar == '\r') { + partialTerminationParsed = true; } else { _parserLine.text += newChar; - _bufferProcessed += 1; } - + // Check that the max request string size is not exceeded if (_parserLine.text.length() > lengthLimit) { HTTPS_LOGW("Header length exceeded. FID=%d", _socket); diff --git a/src/HTTPConnection.hpp b/src/HTTPConnection.hpp index 2e9d0cb..d59c082 100644 --- a/src/HTTPConnection.hpp +++ b/src/HTTPConnection.hpp @@ -134,6 +134,8 @@ class HTTPConnection : private ConnectionContext { int _bufferProcessed; // The index on the receive_buffer that is the first one which is empty at the end. int _bufferUnusedIdx; + // If \r character has been read, in this case we expect \n to terminate the line + bool partialTerminationParsed = false; // Socket address, length etc for the connection struct sockaddr _sockAddr;