diff --git a/src/PerMessageDeflate.h b/src/PerMessageDeflate.h index c40604b..79aa3be 100644 --- a/src/PerMessageDeflate.h +++ b/src/PerMessageDeflate.h @@ -54,8 +54,9 @@ namespace uWS { #ifdef UWS_NO_ZLIB struct ZlibContext {}; struct InflationStream { - std::string_view inflate(ZlibContext *zlibContext, std::string_view compressed, size_t maxPayloadLength) { - return compressed; + std::pair inflate(ZlibContext *zlibContext, std::string_view compressed, size_t maxPayloadLength) { + /* Anything here goes, it is never going to be called */ + return {compressed, false}; } }; struct DeflationStream { @@ -188,7 +189,8 @@ struct InflationStream { inflateEnd(&inflationStream); } - std::string_view inflate(ZlibContext *zlibContext, std::string_view compressed, size_t maxPayloadLength) { + /* Zero length inflates are possible and valid */ + std::pair inflate(ZlibContext *zlibContext, std::string_view compressed, size_t maxPayloadLength) { /* We clear this one here, could be done better */ zlibContext->dynamicInflationBuffer.clear(); @@ -214,7 +216,7 @@ struct InflationStream { inflateReset(&inflationStream); if ((err != Z_BUF_ERROR && err != Z_OK) || zlibContext->dynamicInflationBuffer.length() > maxPayloadLength) { - return {nullptr, 0}; + return {{nullptr, 0}, false}; } if (zlibContext->dynamicInflationBuffer.length()) { @@ -222,7 +224,7 @@ struct InflationStream { /* Let's be strict about the max size */ if (zlibContext->dynamicInflationBuffer.length() > maxPayloadLength) { - return {nullptr, 0}; + return {{nullptr, 0}, false}; } return {zlibContext->dynamicInflationBuffer.data(), zlibContext->dynamicInflationBuffer.length()}; @@ -230,10 +232,10 @@ struct InflationStream { /* Let's be strict about the max size */ if ((LARGE_BUFFER_SIZE - inflationStream.avail_out) > maxPayloadLength) { - return {nullptr, 0}; + return {{nullptr, 0}, false}; } - return {zlibContext->inflationBuffer, LARGE_BUFFER_SIZE - inflationStream.avail_out}; + return {{zlibContext->inflationBuffer, LARGE_BUFFER_SIZE - inflationStream.avail_out}, true}; } }; diff --git a/src/WebSocketContext.h b/src/WebSocketContext.h index 080a930..82ce3fb 100644 --- a/src/WebSocketContext.h +++ b/src/WebSocketContext.h @@ -72,8 +72,8 @@ private: webSocketData->compressionStatus = WebSocketData::CompressionStatus::ENABLED; LoopData *loopData = (LoopData *) us_loop_ext(us_socket_context_loop(SSL, us_socket_context(SSL, (us_socket_t *) s))); - std::string_view inflatedFrame = loopData->inflationStream->inflate(loopData->zlibContext, {data, length}, webSocketContextData->maxPayloadLength); - if (!inflatedFrame.length()) { + auto [inflatedFrame, valid] = loopData->inflationStream->inflate(loopData->zlibContext, {data, length}, webSocketContextData->maxPayloadLength); + if (!valid) { forceClose(webSocketState, s); return true; } else { @@ -124,8 +124,8 @@ private: ) ); - std::string_view inflatedFrame = loopData->inflationStream->inflate(loopData->zlibContext, {webSocketData->fragmentBuffer.data(), webSocketData->fragmentBuffer.length() - 4}, webSocketContextData->maxPayloadLength); - if (!inflatedFrame.length()) { + auto [inflatedFrame, valid] = loopData->inflationStream->inflate(loopData->zlibContext, {webSocketData->fragmentBuffer.data(), webSocketData->fragmentBuffer.length() - 4}, webSocketContextData->maxPayloadLength); + if (!valid) { forceClose(webSocketState, s); return true; } else {