Index: third_party/zlib/compress.c |
diff --git a/third_party/zlib/compress.c b/third_party/zlib/compress.c |
index 6e9762676a0d052ac224b72dac12f2b5ffffaba5..e2db404abf888bd2c85844985b5ae9784b955c63 100644 |
--- a/third_party/zlib/compress.c |
+++ b/third_party/zlib/compress.c |
@@ -1,5 +1,5 @@ |
/* compress.c -- compress a memory buffer |
- * Copyright (C) 1995-2005 Jean-loup Gailly. |
+ * Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler |
* For conditions of distribution and use, see copyright notice in zlib.h |
*/ |
@@ -28,16 +28,11 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) |
{ |
z_stream stream; |
int err; |
+ const uInt max = (uInt)-1; |
+ uLong left; |
- stream.next_in = (z_const Bytef *)source; |
- stream.avail_in = (uInt)sourceLen; |
-#ifdef MAXSEG_64K |
- /* Check for source > 64K on 16-bit machine: */ |
- if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; |
-#endif |
- stream.next_out = dest; |
- stream.avail_out = (uInt)*destLen; |
- if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; |
+ left = *destLen; |
+ *destLen = 0; |
stream.zalloc = (alloc_func)0; |
stream.zfree = (free_func)0; |
@@ -46,15 +41,26 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) |
err = deflateInit(&stream, level); |
if (err != Z_OK) return err; |
- err = deflate(&stream, Z_FINISH); |
- if (err != Z_STREAM_END) { |
- deflateEnd(&stream); |
- return err == Z_OK ? Z_BUF_ERROR : err; |
- } |
- *destLen = stream.total_out; |
+ stream.next_out = dest; |
+ stream.avail_out = 0; |
+ stream.next_in = (z_const Bytef *)source; |
+ stream.avail_in = 0; |
+ |
+ do { |
+ if (stream.avail_out == 0) { |
+ stream.avail_out = left > (uLong)max ? max : (uInt)left; |
+ left -= stream.avail_out; |
+ } |
+ if (stream.avail_in == 0) { |
+ stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen; |
+ sourceLen -= stream.avail_in; |
+ } |
+ err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH); |
+ } while (err == Z_OK); |
- err = deflateEnd(&stream); |
- return err; |
+ *destLen = stream.total_out; |
+ deflateEnd(&stream); |
+ return err == Z_STREAM_END ? Z_OK : err; |
} |
/* =========================================================================== |