From 016a7a9c9b1ca1f04a8d85c56699f6d6b77258a0 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Mon, 13 Nov 2023 16:30:37 +0000 Subject: [PATCH] hyprctl: use a rolling buffer for reading requests fixes #3846 --- src/debug/HyprCtl.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp index c09251a8..217895b1 100644 --- a/src/debug/HyprCtl.cpp +++ b/src/debug/HyprCtl.cpp @@ -1385,14 +1385,14 @@ int hyprCtlFDTick(int fd, uint32_t mask, void* data) { if (mask & WL_EVENT_ERROR || mask & WL_EVENT_HANGUP) return 0; - sockaddr_in clientAddress; - socklen_t clientSize = sizeof(clientAddress); + sockaddr_in clientAddress; + socklen_t clientSize = sizeof(clientAddress); - const auto ACCEPTEDCONNECTION = accept4(HyprCtl::iSocketFD, (sockaddr*)&clientAddress, &clientSize, SOCK_CLOEXEC); + const auto ACCEPTEDCONNECTION = accept4(HyprCtl::iSocketFD, (sockaddr*)&clientAddress, &clientSize, SOCK_CLOEXEC); - char readBuffer[1024]; + std::array readBuffer; - fd_set fdset; + fd_set fdset; FD_ZERO(&fdset); FD_SET(ACCEPTEDCONNECTION, &fdset); timeval timeout = {.tv_sec = 0, .tv_usec = 5000}; @@ -1403,10 +1403,17 @@ int hyprCtlFDTick(int fd, uint32_t mask, void* data) { return 0; } - auto messageSize = read(ACCEPTEDCONNECTION, readBuffer, 1024); - readBuffer[messageSize == 1024 ? 1023 : messageSize] = '\0'; - - std::string request(readBuffer); + std::string request; + while (true) { + readBuffer.fill(0); + auto messageSize = read(ACCEPTEDCONNECTION, readBuffer.data(), 1023); + if (messageSize < 1) + break; + std::string recvd = readBuffer.data(); + request += recvd; + if (messageSize < 1023) + break; + } std::string reply = "";