|
From 9b9531d90dfd8a334958d23394afafd0185bfa21 Mon Sep 17 00:00:00 2001
|
|
From: Willy Tarreau <w@1wt.eu>
|
|
Date: Sat, 28 Mar 2015 12:20:33 +0100
|
|
Subject: [PATCH 8/9] BUG/MINOR: compression: consider the expansion factor in
|
|
init
|
|
|
|
When checking if the buffer is large enough, we used to rely on a fixed
|
|
size that was "apparently" enough. We need to consider the expansion
|
|
factor of deflate-encoded streams instead, which is of 5 bytes per 32kB.
|
|
The previous value was OK till 128kB buffers but became wrong past that.
|
|
It's totally harmless since we always keep the reserve when compressiong,
|
|
so there's 1kB or so available, which is enough for buffers as large as
|
|
6.5 MB, but better fix the check anyway.
|
|
|
|
This fix could be backported into 1.5 since compression was added there.
|
|
(cherry picked from commit 2aee2215c908c6997addcd1714b5b10f73c0703d)
|
|
---
|
|
src/compression.c | 9 ++++++---
|
|
1 file changed, 6 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/compression.c b/src/compression.c
|
|
index 3d6085e..d55f14e 100644
|
|
--- a/src/compression.c
|
|
+++ b/src/compression.c
|
|
@@ -130,9 +130,12 @@ int http_compression_buffer_init(struct session *s, struct buffer *in, struct bu
|
|
{
|
|
int left;
|
|
|
|
- /* not enough space */
|
|
- if (in->size - buffer_len(in) < 40)
|
|
- return -1;
|
|
+ /* output stream requires at least 10 bytes for the gzip header, plus
|
|
+ * at least 8 bytes for the gzip trailer (crc+len), plus a possible
|
|
+ * plus at most 5 bytes per 32kB block and 2 bytes to close the stream.
|
|
+ */
|
|
+ if (in->size - buffer_len(in) < 20 + 5 * ((in->i + 32767) >> 15))
|
|
+ return -1;
|
|
|
|
/* We start by copying the current buffer's pending outgoing data into
|
|
* a new temporary buffer that we initialize with a new empty chunk.
|
|
--
|
|
2.0.5
|
|
|