|
@@ -176,6 +176,7 @@ int zlib_deflateInit2(
|
|
deflate_state *s;
|
|
deflate_state *s;
|
|
int noheader = 0;
|
|
int noheader = 0;
|
|
deflate_workspace *mem;
|
|
deflate_workspace *mem;
|
|
|
|
+ char *next;
|
|
|
|
|
|
ush *overlay;
|
|
ush *overlay;
|
|
/* We overlay pending_buf and d_buf+l_buf. This works since the average
|
|
/* We overlay pending_buf and d_buf+l_buf. This works since the average
|
|
@@ -199,6 +200,21 @@ int zlib_deflateInit2(
|
|
strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
|
|
strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
|
|
return Z_STREAM_ERROR;
|
|
return Z_STREAM_ERROR;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Direct the workspace's pointers to the chunks that were allocated
|
|
|
|
+ * along with the deflate_workspace struct.
|
|
|
|
+ */
|
|
|
|
+ next = (char *) mem;
|
|
|
|
+ next += sizeof(*mem);
|
|
|
|
+ mem->window_memory = (Byte *) next;
|
|
|
|
+ next += zlib_deflate_window_memsize(windowBits);
|
|
|
|
+ mem->prev_memory = (Pos *) next;
|
|
|
|
+ next += zlib_deflate_prev_memsize(windowBits);
|
|
|
|
+ mem->head_memory = (Pos *) next;
|
|
|
|
+ next += zlib_deflate_head_memsize(memLevel);
|
|
|
|
+ mem->overlay_memory = next;
|
|
|
|
+
|
|
s = (deflate_state *) &(mem->deflate_memory);
|
|
s = (deflate_state *) &(mem->deflate_memory);
|
|
strm->state = (struct internal_state *)s;
|
|
strm->state = (struct internal_state *)s;
|
|
s->strm = strm;
|
|
s->strm = strm;
|
|
@@ -1247,7 +1263,18 @@ static block_state deflate_slow(
|
|
return flush == Z_FINISH ? finish_done : block_done;
|
|
return flush == Z_FINISH ? finish_done : block_done;
|
|
}
|
|
}
|
|
|
|
|
|
-int zlib_deflate_workspacesize(void)
|
|
|
|
|
|
+int zlib_deflate_workspacesize(int windowBits, int memLevel)
|
|
{
|
|
{
|
|
- return sizeof(deflate_workspace);
|
|
|
|
|
|
+ if (windowBits < 0) /* undocumented feature: suppress zlib header */
|
|
|
|
+ windowBits = -windowBits;
|
|
|
|
+
|
|
|
|
+ /* Since the return value is typically passed to vmalloc() unchecked... */
|
|
|
|
+ BUG_ON(memLevel < 1 || memLevel > MAX_MEM_LEVEL || windowBits < 9 ||
|
|
|
|
+ windowBits > 15);
|
|
|
|
+
|
|
|
|
+ return sizeof(deflate_workspace)
|
|
|
|
+ + zlib_deflate_window_memsize(windowBits)
|
|
|
|
+ + zlib_deflate_prev_memsize(windowBits)
|
|
|
|
+ + zlib_deflate_head_memsize(memLevel)
|
|
|
|
+ + zlib_deflate_overlay_memsize(memLevel);
|
|
}
|
|
}
|