sock: avoid endless loop in sock_recv_chunk_header (2)

This commit is contained in:
2026-06-03 00:53:25 +02:00
parent c6bc32fab2
commit 0ab1d2af96
2 changed files with 20 additions and 15 deletions
+19 -13
View File
@@ -414,31 +414,37 @@ long sock_recv_chunk_header(sock *s) {
return len;
}
long ret;
long ret1, ret2;
size_t len = 0;
char buf[20];
char buf[20], *buf_ptr = buf;
do {
if ((ret = sock_recv(s, buf, sizeof(buf) - 1, MSG_PEEK)) <= 0) {
while (1) {
if ((ret1 = sock_recv(s, buf_ptr, sizeof(buf) - 1 - (buf_ptr - buf), MSG_PEEK)) <= 0) {
if (errno == EINTR || errno == EAGAIN) {
errno = 0;
continue;
} else {
return -1;
}
} else if (ret < 2 || ret >= sizeof(buf)) {
}
buf_ptr[ret1] = 0;
if ((ret2 = parse_chunk_header(buf, (buf_ptr - buf) + ret1, &len)) == -1) {
if (errno == EPROTO) {
return -1;
} else {
if (sock_recv_x(s, buf_ptr, ret1, 0) == -1)
return -1;
}
buf[ret] = 0;
if ((ret = parse_chunk_header(buf, ret, &len)) == -1 && errno == EPROTO)
} else {
if (sock_recv_x(s, buf_ptr, len - (buf_ptr - buf), 0) == -1)
return -1;
} while (ret < 0);
break;
}
buf_ptr += ret1;
}
if (sock_recv_x(s, buf, len, 0) == -1)
return -1;
return ret;
return ret2;
}
int sock_send_chunk_header(sock *s, unsigned long size) {
-1
View File
@@ -30,7 +30,6 @@ void fastcgi_frame_handler_func(fastcgi_ctx_t *ctx) {
default:
// end of request received
write(ctx->cnx.fd_out, &val, sizeof(val));
write(ctx->cnx.fd_out, "\r\n", 2);
fastcgi_close(ctx);
}
}