Commit 88e47843 authored by Roy T. Fielding's avatar Roy T. Fielding
Browse files

Revert changes in 2.2.11 that caused an invalid

etag to be emitted for on-the-fly gzip content-encoding.
PR 39727 will require larger fixes and this fix was far more
harmful than the original code.

PR: 45023, 39727


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@761835 13f79535-47bb-0310-9956-ffa450edef68
parent 0dff419a
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
                                                         -*- coding: utf-8 -*-
Changes with Apache 2.2.12
  
  *) mod_deflate: revert changes in 2.2.11 that caused an invalid
     etag to be emitted for on-the-fly gzip content-encoding.
     PR 39727 will require larger fixes and this fix was far more
     harmful than the original code. PR 45023. [Roy T. Fielding]

  *) mod_disk_cache: The module now turns off sendfile support if
     'EnableSendfile off' is defined globally. PR 41218.
     [Lars Eilebrecht, Issac Goldstand]
+0 −36
Original line number Diff line number Diff line
@@ -372,41 +372,7 @@ static apr_status_t deflate_ctx_cleanup(void *data)
        ctx->libz_end_func(&ctx->stream);
    return APR_SUCCESS;
}
/* ETag must be unique among the possible representations, so a change
 * to content-encoding requires a corresponding change to the ETag.
 * This routine appends -transform (e.g., -gzip) to the entity-tag
 * value inside the double-quotes if an ETag has already been set
 * and its value already contains double-quotes. PR 39727
 */
static void deflate_check_etag(request_rec *r, const char *transform)
{
    const char *etag = apr_table_get(r->headers_out, "ETag");
    apr_size_t etaglen;

    if ((etag && ((etaglen = strlen(etag)) > 2))) {
        if (etag[etaglen - 1] == '"') {
            apr_size_t transformlen = strlen(transform);
            char *newtag = apr_palloc(r->pool, etaglen + transformlen + 2);
            char *d = newtag;
            char *e = d + etaglen - 1;
            const char *s = etag;

            for (; d < e; ++d, ++s) {
                *d = *s;          /* copy etag to newtag up to last quote */
            }
            *d++ = '-';           /* append dash to newtag */
            s = transform;
            e = d + transformlen;
            for (; d < e; ++d, ++s) {
                *d = *s;          /* copy transform to newtag */
            }
            *d++ = '"';           /* append quote to newtag */
            *d   = '\0';          /* null terminate newtag */

            apr_table_setn(r->headers_out, "ETag", newtag);
        }
    }   
}
static apr_status_t deflate_out_filter(ap_filter_t *f,
                                       apr_bucket_brigade *bb)
{
@@ -604,7 +570,6 @@ static apr_status_t deflate_out_filter(ap_filter_t *f,
        }
        apr_table_unset(r->headers_out, "Content-Length");
        apr_table_unset(r->headers_out, "Content-MD5");
        deflate_check_etag(r, "gzip");

        /* initialize deflate output buffer */
        ctx->stream.next_out = ctx->buffer;
@@ -1097,7 +1062,6 @@ static apr_status_t inflate_out_filter(ap_filter_t *f,
        /* these are unlikely to be set anyway, but ... */
        apr_table_unset(r->headers_out, "Content-Length");
        apr_table_unset(r->headers_out, "Content-MD5");
        deflate_check_etag(r, "gunzip");

        /* initialize inflate output buffer */
        ctx->stream.next_out = ctx->buffer;