]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: compression: Disable it if another one is already in progress
authorChristopher Faulet <cfaulet@haproxy.com>
Mon, 7 Jan 2019 13:41:59 +0000 (14:41 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 8 Jan 2019 10:31:56 +0000 (11:31 +0100)
Since the commit 9666720c8 ("BUG/MEDIUM: compression: Use the right buffer
pointers to compress input data"), the compression can be done twice. The first
time on the frontend and the second time on the backend. This may happen by
configuring the compression in a default section.

To fix the bug, when the response is checked to know if it should be compressed
or not, if the flag HTTP_MSGF_COMPRESSING is set, the compression is not
performed. It means it is already handled by a previous compression filter.

Thanks to Pieter (PiBa-NL) to report this bug.

This patch must be backported to 1.9.

src/flt_http_comp.c

index 380366b0665899c6da8dc9e087605b522c489597..f8fbf4c9d27b3db5d025193c4915628716c0de4f 100644 (file)
@@ -808,6 +808,10 @@ http_select_comp_reshdr(struct comp_state *st, struct stream *s, struct http_msg
        if (st->comp_algo == NULL)
                goto fail;
 
+       /* compression already in progress */
+       if (msg->flags & HTTP_MSGF_COMPRESSING)
+               goto fail;
+
        /* HTTP < 1.1 should not be compressed */
        if (!(msg->flags & HTTP_MSGF_VER_11) || !(txn->req.flags & HTTP_MSGF_VER_11))
                goto fail;
@@ -902,6 +906,10 @@ htx_select_comp_reshdr(struct comp_state *st, struct stream *s, struct http_msg
        if (st->comp_algo == NULL)
                goto fail;
 
+       /* compression already in progress */
+       if (msg->flags & HTTP_MSGF_COMPRESSING)
+               goto fail;
+
        /* HTTP < 1.1 should not be compressed */
        if (!(msg->flags & HTTP_MSGF_VER_11) || !(txn->req.flags & HTTP_MSGF_VER_11))
                goto fail;
@@ -1391,7 +1399,6 @@ check_implicit_http_comp_flt(struct proxy *proxy)
        fconf->conf = NULL;
        fconf->ops  = &comp_ops;
        LIST_ADDQ(&proxy->filter_configs, &fconf->list);
-
  end:
        return err;
 }