aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--inflate.c43
-rw-r--r--inflate.h3
-rw-r--r--zlib.h1
3 files changed, 34 insertions, 13 deletions
diff --git a/inflate.c b/inflate.c
index 5a687a6..9ee84d0 100644
--- a/inflate.c
+++ b/inflate.c
@@ -156,7 +156,7 @@ int windowBits;
156 windowBits = -windowBits; 156 windowBits = -windowBits;
157 } 157 }
158 else { 158 else {
159 wrap = (windowBits >> 4) + 1; 159 wrap = (windowBits >> 4) + 5;
160#ifdef GUNZIP 160#ifdef GUNZIP
161 if (windowBits < 48) 161 if (windowBits < 48)
162 windowBits &= 15; 162 windowBits &= 15;
@@ -701,14 +701,16 @@ int flush;
701 } 701 }
702 if (state->head != Z_NULL) 702 if (state->head != Z_NULL)
703 state->head->text = (int)((hold >> 8) & 1); 703 state->head->text = (int)((hold >> 8) & 1);
704 if (state->flags & 0x0200) CRC2(state->check, hold); 704 if ((state->flags & 0x0200) && (state->wrap & 4))
705 CRC2(state->check, hold);
705 INITBITS(); 706 INITBITS();
706 state->mode = TIME; 707 state->mode = TIME;
707 case TIME: 708 case TIME:
708 NEEDBITS(32); 709 NEEDBITS(32);
709 if (state->head != Z_NULL) 710 if (state->head != Z_NULL)
710 state->head->time = hold; 711 state->head->time = hold;
711 if (state->flags & 0x0200) CRC4(state->check, hold); 712 if ((state->flags & 0x0200) && (state->wrap & 4))
713 CRC4(state->check, hold);
712 INITBITS(); 714 INITBITS();
713 state->mode = OS; 715 state->mode = OS;
714 case OS: 716 case OS:
@@ -717,7 +719,8 @@ int flush;
717 state->head->xflags = (int)(hold & 0xff); 719 state->head->xflags = (int)(hold & 0xff);
718 state->head->os = (int)(hold >> 8); 720 state->head->os = (int)(hold >> 8);
719 } 721 }
720 if (state->flags & 0x0200) CRC2(state->check, hold); 722 if ((state->flags & 0x0200) && (state->wrap & 4))
723 CRC2(state->check, hold);
721 INITBITS(); 724 INITBITS();
722 state->mode = EXLEN; 725 state->mode = EXLEN;
723 case EXLEN: 726 case EXLEN:
@@ -726,7 +729,8 @@ int flush;
726 state->length = (unsigned)(hold); 729 state->length = (unsigned)(hold);
727 if (state->head != Z_NULL) 730 if (state->head != Z_NULL)
728 state->head->extra_len = (unsigned)hold; 731 state->head->extra_len = (unsigned)hold;
729 if (state->flags & 0x0200) CRC2(state->check, hold); 732 if ((state->flags & 0x0200) && (state->wrap & 4))
733 CRC2(state->check, hold);
730 INITBITS(); 734 INITBITS();
731 } 735 }
732 else if (state->head != Z_NULL) 736 else if (state->head != Z_NULL)
@@ -744,7 +748,7 @@ int flush;
744 len + copy > state->head->extra_max ? 748 len + copy > state->head->extra_max ?
745 state->head->extra_max - len : copy); 749 state->head->extra_max - len : copy);
746 } 750 }
747 if (state->flags & 0x0200) 751 if ((state->flags & 0x0200) && (state->wrap & 4))
748 state->check = crc32(state->check, next, copy); 752 state->check = crc32(state->check, next, copy);
749 have -= copy; 753 have -= copy;
750 next += copy; 754 next += copy;
@@ -765,7 +769,7 @@ int flush;
765 state->length < state->head->name_max) 769 state->length < state->head->name_max)
766 state->head->name[state->length++] = len; 770 state->head->name[state->length++] = len;
767 } while (len && copy < have); 771 } while (len && copy < have);
768 if (state->flags & 0x0200) 772 if ((state->flags & 0x0200) && (state->wrap & 4))
769 state->check = crc32(state->check, next, copy); 773 state->check = crc32(state->check, next, copy);
770 have -= copy; 774 have -= copy;
771 next += copy; 775 next += copy;
@@ -786,7 +790,7 @@ int flush;
786 state->length < state->head->comm_max) 790 state->length < state->head->comm_max)
787 state->head->comment[state->length++] = len; 791 state->head->comment[state->length++] = len;
788 } while (len && copy < have); 792 } while (len && copy < have);
789 if (state->flags & 0x0200) 793 if ((state->flags & 0x0200) && (state->wrap & 4))
790 state->check = crc32(state->check, next, copy); 794 state->check = crc32(state->check, next, copy);
791 have -= copy; 795 have -= copy;
792 next += copy; 796 next += copy;
@@ -798,7 +802,7 @@ int flush;
798 case HCRC: 802 case HCRC:
799 if (state->flags & 0x0200) { 803 if (state->flags & 0x0200) {
800 NEEDBITS(16); 804 NEEDBITS(16);
801 if (hold != (state->check & 0xffff)) { 805 if ((state->wrap & 4) && hold != (state->check & 0xffff)) {
802 strm->msg = (char *)"header crc mismatch"; 806 strm->msg = (char *)"header crc mismatch";
803 state->mode = BAD; 807 state->mode = BAD;
804 break; 808 break;
@@ -1179,11 +1183,11 @@ int flush;
1179 out -= left; 1183 out -= left;
1180 strm->total_out += out; 1184 strm->total_out += out;
1181 state->total += out; 1185 state->total += out;
1182 if (out) 1186 if ((state->wrap & 4) && out)
1183 strm->adler = state->check = 1187 strm->adler = state->check =
1184 UPDATE(state->check, put - out, out); 1188 UPDATE(state->check, put - out, out);
1185 out = left; 1189 out = left;
1186 if (( 1190 if ((state->wrap & 4) && (
1187#ifdef GUNZIP 1191#ifdef GUNZIP
1188 state->flags ? hold : 1192 state->flags ? hold :
1189#endif 1193#endif
@@ -1242,7 +1246,7 @@ int flush;
1242 strm->total_in += in; 1246 strm->total_in += in;
1243 strm->total_out += out; 1247 strm->total_out += out;
1244 state->total += out; 1248 state->total += out;
1245 if (state->wrap && out) 1249 if ((state->wrap & 4) && out)
1246 strm->adler = state->check = 1250 strm->adler = state->check =
1247 UPDATE(state->check, strm->next_out - out, out); 1251 UPDATE(state->check, strm->next_out - out, out);
1248 strm->data_type = state->bits + (state->last ? 64 : 0) + 1252 strm->data_type = state->bits + (state->last ? 64 : 0) +
@@ -1501,6 +1505,21 @@ int subvert;
1501#endif 1505#endif
1502} 1506}
1503 1507
1508int ZEXPORT inflateValidate(strm, check)
1509z_streamp strm;
1510int check;
1511{
1512 struct inflate_state FAR *state;
1513
1514 if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
1515 state = (struct inflate_state FAR *)strm->state;
1516 if (check)
1517 state->wrap |= 4;
1518 else
1519 state->wrap &= ~4;
1520 return Z_OK;
1521}
1522
1504long ZEXPORT inflateMark(strm) 1523long ZEXPORT inflateMark(strm)
1505z_streamp strm; 1524z_streamp strm;
1506{ 1525{
diff --git a/inflate.h b/inflate.h
index fbc9a67..adbc775 100644
--- a/inflate.h
+++ b/inflate.h
@@ -82,7 +82,8 @@ typedef enum {
82struct inflate_state { 82struct inflate_state {
83 inflate_mode mode; /* current inflate mode */ 83 inflate_mode mode; /* current inflate mode */
84 int last; /* true if processing last block */ 84 int last; /* true if processing last block */
85 int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ 85 int wrap; /* bit 0 true for zlib, bit 1 true for gzip,
86 bit 2 true to validate check value */
86 int havedict; /* true if dictionary provided */ 87 int havedict; /* true if dictionary provided */
87 int flags; /* gzip header method and flags (0 if zlib) */ 88 int flags; /* gzip header method and flags (0 if zlib) */
88 unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ 89 unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */
diff --git a/zlib.h b/zlib.h
index 66dc600..67cfd7e 100644
--- a/zlib.h
+++ b/zlib.h
@@ -1769,6 +1769,7 @@ ZEXTERN const char * ZEXPORT zError OF((int));
1769ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); 1769ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp));
1770ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); 1770ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void));
1771ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); 1771ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int));
1772ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int));
1772ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); 1773ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp));
1773ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); 1774ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp));
1774#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) 1775#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO)