From: Jeff Trawick Date: Mon, 15 Jan 2001 18:01:48 +0000 (+0000) Subject: Fix an endless loop in ab which occurred when ab was posting X-Git-Tag: APACHE_2_0_BETA_CANDIDATE_1~198 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=96314873ff62c43e31acb3af7a30754b0d37fa1e;p=apache Fix an endless loop in ab which occurred when ab was posting and the server dropped the connection unexpectedly. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@87689 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 9d5fdafa51..b8291be091 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,9 @@ Changes with Apache 2.0b1 + *) Fix an endless loop in ab which occurred when ab was posting + and the server dropped the connection unexpectedly. + [Jeff Trawick] + *) Fix a segfault in ap_http_filter(). I hit the segfault while discarding the body of a request, but it could affect other paths. [Jeff Trawick] diff --git a/support/ab.c b/support/ab.c index 0df71211fe..97e3b39156 100644 --- a/support/ab.c +++ b/support/ab.c @@ -858,18 +858,25 @@ static void test(void) continue; apr_get_revents(&rv, con[i].aprsock, readbits); - /* Note: APR_POLLHUP is set after FIN is received on some - * systems, so treat that like APR_POLLIN so that we try - * to read again. + /* Notes: APR_POLLHUP is set after FIN is received on some + * systems, so treat that like APR_POLLIN so that we try + * to read again. + * + * Some systems return APR_POLLERR with APR_POLLHUP. We + * need to call read_connection() for APR_POLLHUP, so + * check for APR_POLLHUP first so that a closed connection + * isn't treated like an I/O error. If it is, we never + * figure out that the connection is done and we loop + * here endlessly calling apr_poll(). */ + if ((rv & APR_POLLIN) || (rv & APR_POLLPRI) || (rv & APR_POLLHUP)) + read_connection(&con[i]); if ((rv & APR_POLLERR) || (rv & APR_POLLNVAL)) { bad++; err_except++; start_connect(&con[i]); continue; } - if ((rv & APR_POLLIN) || (rv & APR_POLLPRI) || (rv & APR_POLLHUP)) - read_connection(&con[i]); if (rv & APR_POLLOUT) write_request(&con[i]); @@ -896,14 +903,14 @@ static void test(void) static void copyright(void) { if (!use_html) { - printf("This is ApacheBench, Version %s\n", AB_VERSION " <$Revision: 1.48 $> apache-2.0"); + printf("This is ApacheBench, Version %s\n", AB_VERSION " <$Revision: 1.49 $> apache-2.0"); printf("Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/\n"); printf("Copyright (c) 1998-2000 The Apache Software Foundation, http://www.apache.org/\n"); printf("\n"); } else { printf("

\n"); - printf(" This is ApacheBench, Version %s <%s> apache-2.0
\n", AB_VERSION, "$Revision: 1.48 $"); + printf(" This is ApacheBench, Version %s <%s> apache-2.0
\n", AB_VERSION, "$Revision: 1.49 $"); printf(" Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
\n"); printf(" Copyright (c) 1998-2000 The Apache Software Foundation, http://www.apache.org/
\n"); printf("

\n

\n");