Skip to content

Commit 79ae650

Browse files
committed
Networking: avoid short recv
1 parent 44107f2 commit 79ae650

File tree

2 files changed

+13
-11
lines changed

2 files changed

+13
-11
lines changed

src/common/networking_linux.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,14 @@ const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buf
122122
setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, &timev, sizeof(timev));
123123
}
124124

125-
ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, ffStrbufGetFree(buffer), 0);
126-
127-
if(received > 0)
128-
{
125+
uint32_t recvStart;
126+
do {
127+
recvStart = buffer->length;
128+
ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, ffStrbufGetFree(buffer), 0);
129+
if (received <= 0) break;
129130
buffer->length += (uint32_t) received;
130131
buffer->chars[buffer->length] = '\0';
131-
}
132+
} while (ffStrbufGetFree(buffer) > 0 && strstr(buffer->chars + recvStart, "\r\n\r\n") == NULL);
132133

133134
close(state->sockfd);
134135
return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n") ? NULL : "Invalid response";

src/common/networking_windows.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,14 @@ const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buf
130130
setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*) &timeout, sizeof(timeout));
131131
}
132132

133-
ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, (int)ffStrbufGetFree(buffer), 0);
134-
135-
if(received > 0)
136-
{
137-
buffer->length += (uint32_t) received;
133+
uint32_t recvStart;
134+
do {
135+
recvStart = buffer->length;
136+
ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, (int) ffStrbufGetFree(buffer), 0);
137+
if (received <= 0) break;
138+
buffer->length = recvStart + (uint32_t) received;
138139
buffer->chars[buffer->length] = '\0';
139-
}
140+
} while (ffStrbufGetFree(buffer) > 0 && strstr(buffer->chars + recvStart, "\r\n\r\n") == NULL);
140141

141142
closesocket(state->sockfd);
142143
return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n") ? NULL : "Invalid response";

0 commit comments

Comments
 (0)