]> granicus.if.org Git - apache/commitdiff
Empty out the brigade shared by ap_getline()/ap_get_client_block()
authorJeff Trawick <trawick@apache.org>
Tue, 20 Mar 2001 21:40:50 +0000 (21:40 +0000)
committerJeff Trawick <trawick@apache.org>
Tue, 20 Mar 2001 21:40:50 +0000 (21:40 +0000)
on error exit from ap_getline().  Some other code got upset because
the wrong data was in the brigade.

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

CHANGES
server/protocol.c

diff --git a/CHANGES b/CHANGES
index 81d4a1dcd82461a9b1662af30b5dd44ce65129bf..2618ad7efcdeb6a0f2c257708f0067f56fa7e8fb 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,9 @@
 Changes with Apache 2.0.15-dev
 
+  *) Empty out the brigade shared by ap_getline()/ap_get_client_block()
+     on error exit from ap_getline().  Some other code got upset because
+     the wrong data was in the brigade.  [Greg Ames, Jeff Trawick]
+
   *) Handle ap_discard_request_body() being called more than once.
      [Greg Ames, Jeff Trawick]
 
index a58389a05a225b45e1c993714983ded53c67b6cd..86a01e91e4859d38709c4ac237183c1ee116ed0d 100644 (file)
@@ -519,8 +519,12 @@ AP_CORE_DECLARE(int) ap_getline(char *s, int n, request_rec *r, int fold)
 
     while (1) {
         if (APR_BRIGADE_EMPTY(b)) {
-            if (ap_get_brigade(c->input_filters, b, AP_MODE_BLOCKING) != APR_SUCCESS ||
+            if ((retval = ap_get_brigade(c->input_filters, b, AP_MODE_BLOCKING)) != APR_SUCCESS ||
                 APR_BRIGADE_EMPTY(b)) {
+                apr_brigade_destroy(b);
+                if (retval != APR_EOF && retval != APR_TIMEUP) {
+                    ap_log_rerror(APLOG_MARK, APLOG_ERR, retval, r, "ap_get_brigade() failed");
+                }
                 return -1;
             }
         }
@@ -530,10 +534,15 @@ AP_CORE_DECLARE(int) ap_getline(char *s, int n, request_rec *r, int fold)
             continue;
         }
         retval = apr_bucket_read(e, &temp, &length, APR_BLOCK_READ);
-
         if (retval != APR_SUCCESS) {
-            total = ((length < 0) && (total == 0)) ? -1 : total;
-            break;
+            apr_brigade_destroy(b);
+            ap_log_rerror(APLOG_MARK, APLOG_ERR, retval, r, "apr_bucket_read() failed");
+            if (total) {
+                break; /* report previously-read data to caller, do ap_xlate_proto_to_ascii() */
+            }
+            else {
+                return -1;
+            }
         }
 
         if ((looking_ahead) && (*temp != APR_ASCII_BLANK) && (*temp != APR_ASCII_TAB)) { 
@@ -552,12 +561,12 @@ AP_CORE_DECLARE(int) ap_getline(char *s, int n, request_rec *r, int fold)
         else {
             /* input line was larger than the caller's buffer */
             apr_brigade_destroy(b); 
-            
+
             /* don't need to worry about req_cfg->bb being bogus.
              * the request is about to die, and ErrorDocument
              * redirects get a new req_cfg->bb
              */
-            
+
             return -1;
         }