From: Graham Leggett Date: Sun, 8 Apr 2001 14:52:19 +0000 (+0000) Subject: More error checks to make sure the poll() loop dies when the connection X-Git-Tag: 2.0.17~87 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c3cdf7f42fefa58943889809e2c81187aa14f97b;p=thirdparty%2Fapache%2Fhttpd.git More error checks to make sure the poll() loop dies when the connection on either side is closed... PR: Obtained from: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@88768 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/proxy/proxy_connect.c b/modules/proxy/proxy_connect.c index 2b7b9f88331..d7e18ba9fe9 100644 --- a/modules/proxy/proxy_connect.c +++ b/modules/proxy/proxy_connect.c @@ -324,66 +324,69 @@ int ap_proxy_connect_handler(request_rec *r, char *url, "proxy: CONNECT: error creating client apr_socket_t"); return HTTP_INTERNAL_SERVER_ERROR; } - apr_poll_socket_add(pollfd, client_sock, APR_POLLIN); +/* apr_poll_socket_add(pollfd, client_sock, APR_POLLIN);*/ #endif + apr_poll_socket_add(pollfd, r->connection->client_socket, APR_POLLIN); /* Add the server side to the poll */ apr_poll_socket_add(pollfd, sock, APR_POLLIN); - apr_poll_socket_add(pollfd, r->connection->client_socket, APR_POLLIN); while (1) { /* Infinite loop until error (one side closes the connection) */ - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r->server, "proxy: CONNECT: going to sleep (poll)"); - if(apr_poll(pollfd, &pollcnt, -1) != APR_SUCCESS) +/* ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r->server, "proxy: CONNECT: going to sleep (poll)");*/ + if (apr_poll(pollfd, &pollcnt, -1) != APR_SUCCESS) { apr_socket_close(sock); ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "proxy: CONNECT: error apr_poll()"); return HTTP_INTERNAL_SERVER_ERROR; } - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r->server, - "proxy: CONNECT: woke from select(), i=%d", pollcnt); +/* ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r->server, + "proxy: CONNECT: woke from select(), i=%d", pollcnt);*/ if (pollcnt) { - apr_poll_revents_get(&pollevent, sock, pollfd); + apr_poll_revents_get(&pollevent, sock, pollfd); if (pollevent & APR_POLLIN) { - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r->server, - "proxy: CONNECT: sock was set"); - nbytes = HUGE_STRING_LEN; - if(apr_recv(sock, buffer, &nbytes) == APR_SUCCESS) { +/* ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r->server, + "proxy: CONNECT: sock was set");*/ + nbytes = sizeof(buffer); + if (apr_recv(sock, buffer, &nbytes) == APR_SUCCESS) { int o = 0; while(nbytes) { i = nbytes; - apr_send(r->connection->client_socket, buffer + o, &i); + if (apr_send(r->connection->client_socket, buffer + o, &i) != APR_SUCCESS) + break; o += i; nbytes -= i; } - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r->server, - "proxy: CONNECT: wrote %d bytes to client", nbytes); } else break; } + else if ((pollevent & APR_POLLERR) || (pollevent & APR_POLLHUP)) + break; + apr_poll_revents_get(&pollevent, r->connection->client_socket, pollfd); if (pollevent & APR_POLLIN) { - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r->server, - "proxy: CONNECT: client was set"); - nbytes = HUGE_STRING_LEN; - if(apr_recv(r->connection->client_socket, buffer, &nbytes) == APR_SUCCESS) { +/* ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r->server, + "proxy: CONNECT: client was set");*/ + nbytes = sizeof(buffer); + if (apr_recv(r->connection->client_socket, buffer, &nbytes) == APR_SUCCESS) { int o = 0; while(nbytes) { i = nbytes; - apr_send(sock, buffer + o, &i); + if (apr_send(sock, buffer + o, &i) != APR_SUCCESS) + break; o += i; nbytes -= i; } - ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, - r->server, "proxy: CONNECT: wrote %d bytes to server", nbytes); } else break; } + else if ((pollevent & APR_POLLERR) || (pollevent & APR_POLLHUP)) + break; } else break;