]> granicus.if.org Git - apache/commitdiff
fix an infinite loop in proxy CONNECT
authorJeff Trawick <trawick@apache.org>
Mon, 16 Aug 2004 16:09:48 +0000 (16:09 +0000)
committerJeff Trawick <trawick@apache.org>
Mon, 16 Aug 2004 16:09:48 +0000 (16:09 +0000)
(problem was only in 2.1-dev)

Submitted by: jean-frederic clere <jfrederic.clere fujitsu-siemens.com>
Reviewed by: Jeff Trawick

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@104683 13f79535-47bb-0310-9956-ffa450edef68

modules/proxy/proxy_connect.c

index a6d9ee44c497f15f52c4ea93cce4fe269b138058..7dd16e34d3ff3664818f3980fb534e9507f4bc19 100644 (file)
@@ -292,8 +292,10 @@ int ap_proxy_connect_handler(request_rec *r, proxy_worker *worker,
             ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: CONNECT: error apr_poll()");
             return HTTP_INTERNAL_SERVER_ERROR;
         }
-/*     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
-                     "proxy: CONNECT: woke from select(), i=%d", pollcnt);*/
+#ifdef DEBUGGING
+        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
+                     "proxy: CONNECT: woke from select(), i=%d", pollcnt);
+#endif
 
         for (i = 0; i < pollcnt; i++) {
             const apr_pollfd_t *cur = &signalled[i];
@@ -301,10 +303,13 @@ int ap_proxy_connect_handler(request_rec *r, proxy_worker *worker,
             if (cur->desc.s == sock) {
                 pollevent = cur->rtnevents;
                 if (pollevent & APR_POLLIN) {
-/*             ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
-                             "proxy: CONNECT: sock was set");*/
+#ifdef DEBUGGING
+                    ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
+                                 "proxy: CONNECT: sock was set");
+#endif
                     nbytes = sizeof(buffer);
-                    if (apr_socket_recv(sock, buffer, &nbytes) == APR_SUCCESS) {
+                    rv = apr_socket_recv(sock, buffer, &nbytes);
+                    if (rv == APR_SUCCESS) {
                         o = 0;
                         i = nbytes;
                         while(i > 0)
@@ -316,7 +321,8 @@ int ap_proxy_connect_handler(request_rec *r, proxy_worker *worker,
      * if ((nbytes = ap_rwrite(buffer + o, nbytes, r)) < 0)
      * rbb
      */
-                            if (apr_socket_send(client_socket, buffer + o, &nbytes) != APR_SUCCESS)
+                            rv = apr_socket_send(client_socket, buffer + o, &nbytes);
+                            if (rv != APR_SUCCESS)
                                 break;
                             o += nbytes;
                             i -= nbytes;
@@ -331,16 +337,24 @@ int ap_proxy_connect_handler(request_rec *r, proxy_worker *worker,
             else if (cur->desc.s == client_socket) {
                 pollevent = cur->rtnevents;
                 if (pollevent & APR_POLLIN) {
-/*             ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
-                             "proxy: CONNECT: client was set");*/
+#ifdef DEBUGGING
+                    ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
+                                 "proxy: CONNECT: client was set");
+#endif
                     nbytes = sizeof(buffer);
-                    if (apr_socket_recv(client_socket, buffer, &nbytes) == APR_SUCCESS) {
+                    rv = apr_socket_recv(client_socket, buffer, &nbytes);
+                    if (rv == APR_SUCCESS) {
                         o = 0;
                         i = nbytes;
+#ifdef DEBUGGING
+                        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
+                                     "proxy: CONNECT: read %d from client", i);
+#endif
                         while(i > 0)
                         {
                             nbytes = i;
-                            if (apr_socket_send(sock, buffer + o, &nbytes) != APR_SUCCESS)
+                            rv = apr_socket_send(sock, buffer + o, &nbytes);
+                            if (rv != APR_SUCCESS)
                                 break;
                             o += nbytes;
                             i -= nbytes;
@@ -355,6 +369,9 @@ int ap_proxy_connect_handler(request_rec *r, proxy_worker *worker,
             else
                 break;
         }
+        if (rv != APR_SUCCESS) {
+            break;
+        }
     }
 
     ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,