From 79ae650c5874caead25144dd17588c8ef7bd178c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 21 Mar 2024 08:58:16 +0800 Subject: [PATCH] Networking: avoid short recv --- src/common/networking_linux.c | 11 ++++++----- src/common/networking_windows.c | 13 +++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/common/networking_linux.c b/src/common/networking_linux.c index 67e03887d..7a8054918 100644 --- a/src/common/networking_linux.c +++ b/src/common/networking_linux.c @@ -122,13 +122,14 @@ const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buf setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, &timev, sizeof(timev)); } - ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, ffStrbufGetFree(buffer), 0); - - if(received > 0) - { + uint32_t recvStart; + do { + recvStart = buffer->length; + ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, ffStrbufGetFree(buffer), 0); + if (received <= 0) break; buffer->length += (uint32_t) received; buffer->chars[buffer->length] = '\0'; - } + } while (ffStrbufGetFree(buffer) > 0 && strstr(buffer->chars + recvStart, "\r\n\r\n") == NULL); close(state->sockfd); return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n") ? NULL : "Invalid response"; diff --git a/src/common/networking_windows.c b/src/common/networking_windows.c index 8c9bd96ea..27a884216 100644 --- a/src/common/networking_windows.c +++ b/src/common/networking_windows.c @@ -130,13 +130,14 @@ const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buf setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*) &timeout, sizeof(timeout)); } - ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, (int)ffStrbufGetFree(buffer), 0); - - if(received > 0) - { - buffer->length += (uint32_t) received; + uint32_t recvStart; + do { + recvStart = buffer->length; + ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, (int) ffStrbufGetFree(buffer), 0); + if (received <= 0) break; + buffer->length = recvStart + (uint32_t) received; buffer->chars[buffer->length] = '\0'; - } + } while (ffStrbufGetFree(buffer) > 0 && strstr(buffer->chars + recvStart, "\r\n\r\n") == NULL); closesocket(state->sockfd); return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n") ? NULL : "Invalid response";