]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: http/compression: Fix how chunked data are copied during the HTTP body...
authorChristopher Faulet <christopher.faulet@capflam.org>
Thu, 22 Sep 2016 13:31:43 +0000 (15:31 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 23 Sep 2016 14:01:14 +0000 (16:01 +0200)
When the compression is enable on HTTP responses, the chunked data are copied in
a temporary buffer during the HTTP body parsing and then compressed when
everything is forwarded to the client. But the amout of data that can be copied
was not correctly calculated. In many cases, it worked, else on the edge when
the channel buffer was almost full.

[wt: bug introduced by b77c5c26 in 1.7-dev, no backport needed]

src/flt_http_comp.c

index 9ddc858372de2258667f743fe28133a3efac6503..249ccdf43789aa56c6e869f97d6551c0f0841c27 100644 (file)
@@ -177,15 +177,17 @@ comp_http_data(struct stream *s, struct filter *filter, struct http_msg *msg)
        }
 
        if (msg->flags & HTTP_MSGF_TE_CHNK) {
-               int block = bi_contig_data(buf);
+               int block;
 
                len = MIN(tmpbuf->size - buffer_len(tmpbuf), len);
-               if (len > block) {
-                       memcpy(bi_end(tmpbuf), b_ptr(buf, *nxt), block);
-                       memcpy(bi_end(tmpbuf)+block, buf->data, len - block);
-               }
-               else
-                       memcpy(bi_end(tmpbuf), b_ptr(buf, *nxt), len);
+
+               b_adv(buf, *nxt);
+               block = bi_contig_data(buf);
+               memcpy(bi_end(tmpbuf), bi_ptr(buf), block);
+               if (len > block)
+                       memcpy(bi_end(tmpbuf)+block, buf->data, len-block);
+               b_rew(buf, *nxt);
+
                tmpbuf->i += len;
                ret        = len;
        }