aboutsummaryrefslogtreecommitdiff
path: root/deflate.c
diff options
context:
space:
mode:
Diffstat (limited to 'deflate.c')
-rw-r--r--deflate.c59
1 files changed, 36 insertions, 23 deletions
diff --git a/deflate.c b/deflate.c
index 801c407..537c4a3 100644
--- a/deflate.c
+++ b/deflate.c
@@ -73,6 +73,7 @@ typedef enum {
73typedef block_state (*compress_func) OF((deflate_state *s, int flush)); 73typedef block_state (*compress_func) OF((deflate_state *s, int flush));
74/* Compression function. Returns the block state after the call. */ 74/* Compression function. Returns the block state after the call. */
75 75
76local int deflateStateCheck OF((z_streamp strm));
76local void fill_window OF((deflate_state *s)); 77local void fill_window OF((deflate_state *s));
77local block_state deflate_stored OF((deflate_state *s, int flush)); 78local block_state deflate_stored OF((deflate_state *s, int flush));
78local block_state deflate_fast OF((deflate_state *s, int flush)); 79local block_state deflate_fast OF((deflate_state *s, int flush));
@@ -271,6 +272,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
271 if (s == Z_NULL) return Z_MEM_ERROR; 272 if (s == Z_NULL) return Z_MEM_ERROR;
272 strm->state = (struct internal_state FAR *)s; 273 strm->state = (struct internal_state FAR *)s;
273 s->strm = strm; 274 s->strm = strm;
275 s->status = INIT_STATE; /* to pass state test in deflateReset() */
274 276
275 s->wrap = wrap; 277 s->wrap = wrap;
276 s->gzhead = Z_NULL; 278 s->gzhead = Z_NULL;
@@ -312,6 +314,28 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
312 return deflateReset(strm); 314 return deflateReset(strm);
313} 315}
314 316
317/* =========================================================================
318 * Check for a valid deflate stream state. Return 0 if ok, 1 if not.
319 */
320local int deflateStateCheck (strm)
321 z_streamp strm;
322{
323 deflate_state *s;
324 if (strm == Z_NULL ||
325 strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
326 return 1;
327 s = strm->state;
328 if (s == Z_NULL || s->strm != strm || (s->status != INIT_STATE &&
329 s->status != EXTRA_STATE &&
330 s->status != NAME_STATE &&
331 s->status != COMMENT_STATE &&
332 s->status != HCRC_STATE &&
333 s->status != BUSY_STATE &&
334 s->status != FINISH_STATE))
335 return 1;
336 return 0;
337}
338
315/* ========================================================================= */ 339/* ========================================================================= */
316int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) 340int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
317 z_streamp strm; 341 z_streamp strm;
@@ -324,7 +348,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
324 unsigned avail; 348 unsigned avail;
325 z_const unsigned char *next; 349 z_const unsigned char *next;
326 350
327 if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) 351 if (deflateStateCheck(strm) || dictionary == Z_NULL)
328 return Z_STREAM_ERROR; 352 return Z_STREAM_ERROR;
329 s = strm->state; 353 s = strm->state;
330 wrap = s->wrap; 354 wrap = s->wrap;
@@ -387,8 +411,7 @@ int ZEXPORT deflateResetKeep (strm)
387{ 411{
388 deflate_state *s; 412 deflate_state *s;
389 413
390 if (strm == Z_NULL || strm->state == Z_NULL || 414 if (deflateStateCheck(strm)) {
391 strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) {
392 return Z_STREAM_ERROR; 415 return Z_STREAM_ERROR;
393 } 416 }
394 417
@@ -433,8 +456,8 @@ int ZEXPORT deflateSetHeader (strm, head)
433 z_streamp strm; 456 z_streamp strm;
434 gz_headerp head; 457 gz_headerp head;
435{ 458{
436 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 459 if (deflateStateCheck(strm) || strm->state->wrap != 2)
437 if (strm->state->wrap != 2) return Z_STREAM_ERROR; 460 return Z_STREAM_ERROR;
438 strm->state->gzhead = head; 461 strm->state->gzhead = head;
439 return Z_OK; 462 return Z_OK;
440} 463}
@@ -445,7 +468,7 @@ int ZEXPORT deflatePending (strm, pending, bits)
445 int *bits; 468 int *bits;
446 z_streamp strm; 469 z_streamp strm;
447{ 470{
448 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 471 if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
449 if (pending != Z_NULL) 472 if (pending != Z_NULL)
450 *pending = strm->state->pending; 473 *pending = strm->state->pending;
451 if (bits != Z_NULL) 474 if (bits != Z_NULL)
@@ -462,7 +485,7 @@ int ZEXPORT deflatePrime (strm, bits, value)
462 deflate_state *s; 485 deflate_state *s;
463 int put; 486 int put;
464 487
465 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 488 if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
466 s = strm->state; 489 s = strm->state;
467 if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) 490 if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3))
468 return Z_BUF_ERROR; 491 return Z_BUF_ERROR;
@@ -489,7 +512,7 @@ int ZEXPORT deflateParams(strm, level, strategy)
489 compress_func func; 512 compress_func func;
490 int err = Z_OK; 513 int err = Z_OK;
491 514
492 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 515 if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
493 s = strm->state; 516 s = strm->state;
494 517
495#ifdef FASTEST 518#ifdef FASTEST
@@ -529,7 +552,7 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
529{ 552{
530 deflate_state *s; 553 deflate_state *s;
531 554
532 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 555 if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
533 s = strm->state; 556 s = strm->state;
534 s->good_match = (uInt)good_length; 557 s->good_match = (uInt)good_length;
535 s->max_lazy_match = (uInt)max_lazy; 558 s->max_lazy_match = (uInt)max_lazy;
@@ -568,7 +591,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen)
568 ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; 591 ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
569 592
570 /* if can't get parameters, return conservative bound plus zlib wrapper */ 593 /* if can't get parameters, return conservative bound plus zlib wrapper */
571 if (strm == Z_NULL || strm->state == Z_NULL) 594 if (deflateStateCheck(strm))
572 return complen + 6; 595 return complen + 6;
573 596
574 /* compute wrapper length */ 597 /* compute wrapper length */
@@ -661,8 +684,7 @@ int ZEXPORT deflate (strm, flush)
661 int old_flush; /* value of flush param for previous deflate call */ 684 int old_flush; /* value of flush param for previous deflate call */
662 deflate_state *s; 685 deflate_state *s;
663 686
664 if (strm == Z_NULL || strm->state == Z_NULL || 687 if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) {
665 flush > Z_BLOCK || flush < 0) {
666 return Z_STREAM_ERROR; 688 return Z_STREAM_ERROR;
667 } 689 }
668 s = strm->state; 690 s = strm->state;
@@ -973,18 +995,9 @@ int ZEXPORT deflateEnd (strm)
973{ 995{
974 int status; 996 int status;
975 997
976 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; 998 if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
977 999
978 status = strm->state->status; 1000 status = strm->state->status;
979 if (status != INIT_STATE &&
980 status != EXTRA_STATE &&
981 status != NAME_STATE &&
982 status != COMMENT_STATE &&
983 status != HCRC_STATE &&
984 status != BUSY_STATE &&
985 status != FINISH_STATE) {
986 return Z_STREAM_ERROR;
987 }
988 1001
989 /* Deallocate in reverse order of allocations: */ 1002 /* Deallocate in reverse order of allocations: */
990 TRY_FREE(strm, strm->state->pending_buf); 1003 TRY_FREE(strm, strm->state->pending_buf);
@@ -1015,7 +1028,7 @@ int ZEXPORT deflateCopy (dest, source)
1015 ushf *overlay; 1028 ushf *overlay;
1016 1029
1017 1030
1018 if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { 1031 if (deflateStateCheck(source) || dest == Z_NULL) {
1019 return Z_STREAM_ERROR; 1032 return Z_STREAM_ERROR;
1020 } 1033 }
1021 1034