sock: avoid endless loop in sock_recv_chunk_header (2)
This commit is contained in:
+9
-11
@@ -414,31 +414,29 @@ long sock_recv_chunk_header(sock *s) {
|
||||
return len;
|
||||
}
|
||||
|
||||
long ret;
|
||||
long ret1, ret2 = -1;
|
||||
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) {
|
||||
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)) {
|
||||
return -1;
|
||||
}
|
||||
buf[ret] = 0;
|
||||
buf_ptr[ret1] = 0;
|
||||
|
||||
if ((ret = parse_chunk_header(buf, ret, &len)) == -1 && errno == EPROTO)
|
||||
if ((ret2 = parse_chunk_header(buf, (buf_ptr - buf) + ret1, &len)) == -1 && errno == EPROTO)
|
||||
return -1;
|
||||
} while (ret < 0);
|
||||
|
||||
if (sock_recv_x(s, buf, len, 0) == -1)
|
||||
if (sock_recv_x(s, buf_ptr, ret1, 0) == -1)
|
||||
return -1;
|
||||
buf_ptr += ret1;
|
||||
} while (ret2 < 0);
|
||||
|
||||
return ret;
|
||||
return ret2;
|
||||
}
|
||||
|
||||
int sock_send_chunk_header(sock *s, unsigned long size) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user