You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by dr...@apache.org on 2017/01/28 17:53:58 UTC

svn commit: r1780725 - /httpd/httpd/trunk/modules/metadata/mod_remoteip.c

Author: druggeri
Date: Sat Jan 28 17:53:58 2017
New Revision: 1780725

URL: http://svn.apache.org/viewvc?rev=1780725&view=rev
Log:
Set all read buckets aside in case we need to restore all during optional header processing

Modified:
    httpd/httpd/trunk/modules/metadata/mod_remoteip.c

Modified: httpd/httpd/trunk/modules/metadata/mod_remoteip.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/metadata/mod_remoteip.c?rev=1780725&r1=1780724&r2=1780725&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/metadata/mod_remoteip.c (original)
+++ httpd/httpd/trunk/modules/metadata/mod_remoteip.c Sat Jan 28 17:53:58 2017
@@ -138,6 +138,7 @@ typedef struct {
     int version;
     ap_input_mode_t mode;
     apr_bucket_brigade *bb;
+    apr_bucket_brigade *store_bb;
     int done;
 } remoteip_filter_context;
 
@@ -1037,6 +1038,7 @@ static apr_status_t remoteip_input_filte
         ctx->version = 0;
         ctx->mode = AP_MODE_READBYTES;
         ctx->bb = apr_brigade_create(f->c->pool, f->c->bucket_alloc);
+        ctx->store_bb = apr_brigade_create(f->c->pool, f->c->bucket_alloc);
         ctx->done = 0;
     }
 
@@ -1077,10 +1079,13 @@ static apr_status_t remoteip_input_filte
             memcpy(ctx->header + ctx->rcvd, ptr, len);
             ctx->rcvd += len;
 
-            /* Remove instead of delete - we may put this bucket
-               back into bb_out if the header was optional and we
-               pass down the chain */
+            /* Put this bucket into our temporary storage brigade because
+               we may permit a request without a header. In that case, the
+               data in the temporary storage brigade just gets copied
+               to bb_out */
             APR_BUCKET_REMOVE(b);
+            apr_bucket_setaside(b, f->c->pool);
+            APR_BRIGADE_INSERT_TAIL(ctx->store_bb, b);
             psts = HDR_NEED_MORE;
 
             if (ctx->version == 0) {
@@ -1119,8 +1124,8 @@ static apr_status_t remoteip_input_filte
                               "RemoteIPProxyProtocol: internal error: unknown version "
                               "%d", ctx->version);
                 f->c->aborted = 1;
-                apr_bucket_delete(b);
                 apr_brigade_destroy(ctx->bb);
+                apr_brigade_destroy(ctx->store_bb);
                 return APR_ECONNABORTED;
             }
 
@@ -1128,10 +1133,11 @@ static apr_status_t remoteip_input_filte
                 case HDR_MISSING:
                     if (conn_conf->proxy_protocol_optional) {
                         /* Same as DONE, but don't delete the bucket. Rather, put it
-                           back into the brigade and move the request along the stack */
+                           into the temporary storgage brigade and move all of the data
+                           in temporary storage to the output brigade */
                         ctx->done = 1;
-                        APR_BRIGADE_INSERT_HEAD(bb_out, b);
-                        return ap_pass_brigade(f->next, ctx->bb);
+                        APR_BRIGADE_PREPEND(bb_out, ctx->store_bb);
+                        return APR_SUCCESS;
                     }
                     else {
                         ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, f->c, APLOGNO(03510)
@@ -1140,20 +1146,16 @@ static apr_status_t remoteip_input_filte
                     }
                 case HDR_ERROR:
                     f->c->aborted = 1;
-                    apr_bucket_delete(b);
                     apr_brigade_destroy(ctx->bb);
+                    apr_brigade_destroy(ctx->store_bb);
                     return APR_ECONNABORTED;
 
                 case HDR_DONE:
-                    apr_bucket_delete(b);
                     ctx->done = 1;
                     break;
 
                 case HDR_NEED_MORE:
-                    /* It is safe to delete this bucket if we get here since we know
-                       that we are definitely processing a header (we've read enough to 
-                       know if the signatures exist on the line) */ 
-                    apr_bucket_delete(b);
+                    /* Do nothing - the content was already set aside */
                     break;
             }
         }
@@ -1177,12 +1179,15 @@ static apr_status_t remoteip_input_filte
                       ctx->rcvd, APR_BRIGADE_EMPTY(ctx->bb));
         f->c->aborted = 1;
         apr_brigade_destroy(ctx->bb);
+        apr_brigade_destroy(ctx->store_bb);
         return APR_ECONNABORTED;
     }
 
     /* clean up */
     apr_brigade_destroy(ctx->bb);
+    apr_brigade_destroy(ctx->store_bb);
     ctx->bb = NULL;
+    ctx->store_bb = NULL;
 
     /* now do the real read for the upper layer */
     return ap_get_brigade(f->next, bb_out, mode, block, readbytes);