projects
/
m6w6
/
ext-http
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
- we need a bit more space for the footer too in http_gzencode()
[m6w6/ext-http]
/
http_encoding_api.c
diff --git
a/http_encoding_api.c
b/http_encoding_api.c
index a1893df44395e0b2de4472ce6a3e05f4ed030406..69b6721bdc4df0fb76d9fce2a419052a49d19ef5 100644
(file)
--- a/
http_encoding_api.c
+++ b/
http_encoding_api.c
@@
-95,8
+95,12
@@
PHP_HTTP_API const char *_http_encoding_dechunk(const char *encoded, size_t enco
#ifdef HTTP_HAVE_ZLIB
#include <zlib.h>
#ifdef HTTP_HAVE_ZLIB
#include <zlib.h>
+/* max count of uncompress trials, alloc_size <<= 2 for each try */
#define HTTP_GZMAXTRY 10
#define HTTP_GZMAXTRY 10
-#define HTTP_GZBUFLEN(l) (l + (l / 1000) + 16 + 1)
+/* safe padding */
+#define HTTP_GZSAFPAD 10
+/* add 1% extra space in case we need to encode widely differing (binary) data */
+#define HTTP_GZBUFLEN(l) (l + (l / 100) + HTTP_GZSAFPAD)
static const char http_gzencode_header[] = {
(const char) 0x1f,
static const char http_gzencode_header[] = {
(const char) 0x1f,
@@
-114,9
+118,9
@@
inline void http_init_gzencode_buffer(z_stream *Z, const char *data, size_t data
Z->next_in = (Bytef *) data;
Z->avail_in = data_len;
Z->next_in = (Bytef *) data;
Z->avail_in = data_len;
- Z->avail_out = HTTP_GZBUFLEN(data_len) - 1;
+ Z->avail_out = HTTP_GZBUFLEN(data_len)
+ HTTP_GZSAFPAD
- 1;
- *buf_ptr = emalloc(
Z->avail_out + sizeof(http_gzencode_header)
);
+ *buf_ptr = emalloc(
HTTP_GZBUFLEN(data_len) + sizeof(http_gzencode_header) + HTTP_GZSAFPAD
);
memcpy(*buf_ptr, http_gzencode_header, sizeof(http_gzencode_header));
Z->next_out = *buf_ptr + sizeof(http_gzencode_header);
memcpy(*buf_ptr, http_gzencode_header, sizeof(http_gzencode_header));
Z->next_out = *buf_ptr + sizeof(http_gzencode_header);
@@
-128,11
+132,11
@@
inline void http_init_deflate_buffer(z_stream *Z, const char *data, size_t data_
Z->zfree = Z_NULL;
Z->opaque = Z_NULL;
Z->zfree = Z_NULL;
Z->opaque = Z_NULL;
- Z->data_type = Z_
ASCII
;
+ Z->data_type = Z_
UNKNOWN
;
Z->next_in = (Bytef *) data;
Z->avail_in = data_len;
Z->avail_out = HTTP_GZBUFLEN(data_len) - 1;
Z->next_in = (Bytef *) data;
Z->avail_in = data_len;
Z->avail_out = HTTP_GZBUFLEN(data_len) - 1;
- Z->next_out = emalloc(
Z->avail_out
);
+ Z->next_out = emalloc(
HTTP_GZBUFLEN(data_len)
);
*buf_ptr = Z->next_out;
}
*buf_ptr = Z->next_out;
}