Commit 686ca8da authored by Joe Orton's avatar Joe Orton
Browse files

Backport from HEAD:

* server/core.c (core_output_filter): Don't explicitly delete the EOC
bucket, and don't buffer the brigade if it ends in an EOC.

Reviewed by: trawick, nd


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/APACHE_2_0_BRANCH@104919 13f79535-47bb-0310-9956-ffa450edef68
parent 9a1991db
Loading
Loading
Loading
Loading
+7 −6
Changes for STATUS: 7 added lines, 6 removed lines.
Original line number Diff line number Diff line
APACHE 2.0 STATUS:                                              -*-text-*-
Last modified at [$Date: 2004/08/28 16:20:08 $]
Last modified at [$Date: 2004/08/31 08:16:56 $]

Release:

@@ -78,15 +78,16 @@ PATCHES TO BACKPORT FROM 2.1
          modules/mappers/mod_rewrite.c: r1.259
        +1: nd
       
    *) EOC bucket handling fix for core_output_filter (prevents possible variable use-
       after-free since .49).
       http://cvs.apache.org/viewcvs.cgi/httpd-2.0/server/core.c?r1=1.276&r2=1.277
       +1: jorton, trawick, nd
       
    *) Don't link suexec against APR/etc libraries.
       http://cvs.apache.org/viewcvs.cgi/httpd-2.0/support/Makefile.in?r1=1.38&r2=1.39
       +1: jorton, trawick
       nd: what about the need of -static (dunno)?
       jorton: -static was needed only to make sure libapr etc were linked statically
       into suexec; they didn't work shared in a binary distribution because
       LD_LIBRARY_PATH etc are ignored for a setuid binary (that only matters
       for binary distributors where suexec gets relocated, since libtool 
       puts an appropriate RPATH in the binary).  Not linking suexec against libapr 
       etc avoids the issue entirely (and avoids scary >1Mb suexec binaries)

    *) mod_headers: Support {...}s tag for SSL variable lookup.
       http://www.apache.org/~jorton/mod_headers-2.0-ssl.diff
+4 −5
Changes for server/core.c: 4 added lines, 5 removed lines.
Original line number Diff line number Diff line
@@ -3947,12 +3947,9 @@ static apr_status_t core_output_filter(ap_filter_t *f, apr_bucket_brigade *b)
        APR_BRIGADE_FOREACH(e, b) {
            /* keep track of the last bucket processed */
            last_e = e;
            if (APR_BUCKET_IS_EOS(e)) {
            if (APR_BUCKET_IS_EOS(e) || AP_BUCKET_IS_EOC(e)) {
                break;
            }
            if (AP_BUCKET_IS_EOC(e)) {
                apr_bucket_delete(e);
            }
            else if (APR_BUCKET_IS_FLUSH(e)) {
                if (e != APR_BRIGADE_LAST(b)) {
                    more = apr_brigade_split(b, APR_BUCKET_NEXT(e));
@@ -4108,7 +4105,8 @@ static apr_status_t core_output_filter(ap_filter_t *f, apr_bucket_brigade *b)
        /* Completed iterating over the brigade, now determine if we want
         * to buffer the brigade or send the brigade out on the network.
         *
         * Save if we haven't accumulated enough bytes to send, and:
         * Save if we haven't accumulated enough bytes to send, the connection
         * is not about to be closed, and:
         *
         *   1) we didn't see a file, we don't have more passes over the
         *      brigade to perform,  AND we didn't stop at a FLUSH bucket.
@@ -4119,6 +4117,7 @@ static apr_status_t core_output_filter(ap_filter_t *f, apr_bucket_brigade *b)
         *       with the hope of concatenating with another response)
         */
        if (nbytes + flen < AP_MIN_BYTES_TO_WRITE
            && !AP_BUCKET_IS_EOC(last_e)
            && ((!fd && !more && !APR_BUCKET_IS_FLUSH(last_e))
                || (APR_BUCKET_IS_EOS(last_e)
                    && c->keepalive == AP_CONN_KEEPALIVE))) {