You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Jeff Trawick <tr...@bellsouth.net> on 2001/06/06 19:56:46 UTC

[PATCH] handle subrequest buckets with the wrong pool

I think this is overzealous (don't always need to do it; instead
should think about whether or not it is going to be held onto by
CORE_OUT) and I don't know that there is a consensus on which solution
to use.

Index: server/request.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/request.c,v
retrieving revision 1.4
diff -u -r1.4 request.c
--- server/request.c	2001/06/06 12:51:21	1.4
+++ server/request.c	2001/06/06 17:58:06
@@ -808,7 +808,40 @@
     apr_bucket *e = APR_BRIGADE_LAST(bb);
 
     if (APR_BUCKET_IS_EOS(e)) {
+        apr_bucket_brigade *tmpbb;
+
         apr_bucket_delete(e);
+
+        if (!APR_BRIGADE_EMPTY(bb)) { /* avoid brigade create/destroy */
+
+            /* We need to be certain that any data in a bucket is valid
+             * after the subrequest pool is cleared.
+             */ 
+            tmpbb = apr_brigade_create(f->c->pool);
+            
+            APR_BRIGADE_FOREACH(e, bb) {
+                const char *str;
+                apr_size_t n;
+                apr_status_t rv;
+                
+                rv = apr_bucket_read(e, &str, &n, APR_BLOCK_READ);
+                /* XXX handle rv! */
+                
+                /* This apr_brigade_write does not use a flush function
+                   because we assume that we will not write enough data
+                   into it to cause a flush. However, if we *do* write
+                   "too much", then we could end up with transient
+                   buckets which would suck. This works for now, but is
+                   a bit shaky if changes are made to some of the
+                   buffering sizes. Let's do an assert to prevent
+                   potential future problems... */
+                AP_DEBUG_ASSERT(AP_MIN_BYTES_TO_WRITE <=
+                                APR_BUCKET_BUFF_SIZE);
+                apr_brigade_write(tmpbb, NULL, NULL, str, n);
+            }
+            apr_brigade_destroy(bb);
+            bb = tmpbb;
+        }
     }
     return ap_pass_brigade(f->next, bb);
 }

-- 
Jeff Trawick | trawickj@bellsouth.net | PGP public key at web site:
       http://www.geocities.com/SiliconValley/Park/9289/
             Born in Roswell... married an alien...