]> granicus.if.org Git - apache/commitdiff
Fix an endless loop in ab which occurred when ab was posting
authorJeff Trawick <trawick@apache.org>
Mon, 15 Jan 2001 18:01:48 +0000 (18:01 +0000)
committerJeff Trawick <trawick@apache.org>
Mon, 15 Jan 2001 18:01:48 +0000 (18:01 +0000)
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

CHANGES
support/ab.c

diff --git a/CHANGES b/CHANGES
index 9d5fdafa517ea6e85504f1876b5d1298dbd652ec..b8291be0919ddede110e013606e3aca658e70889 100644 (file)
--- 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]
index 0df71211fec3c91d1ef229a841e99d489c994e98..97e3b39156d4fce11349213729260b90f33c1f86 100644 (file)
@@ -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("<p>\n");
-        printf(" This is ApacheBench, Version %s <i>&lt;%s&gt;</i> apache-2.0<br>\n", AB_VERSION, "$Revision: 1.48 $");
+        printf(" This is ApacheBench, Version %s <i>&lt;%s&gt;</i> apache-2.0<br>\n", AB_VERSION, "$Revision: 1.49 $");
         printf(" Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br>\n");
         printf(" Copyright (c) 1998-2000 The Apache Software Foundation, http://www.apache.org/<br>\n");
         printf("</p>\n<p>\n");