diff options
author | Mark Adler <madler@alumni.caltech.edu> | 2011-09-09 23:24:33 -0700 |
---|---|---|
committer | Mark Adler <madler@alumni.caltech.edu> | 2011-09-09 23:24:33 -0700 |
commit | 0484693e1723bbab791c56f95597bd7dbe867d03 (patch) | |
tree | 8f31dbed98b4390da74a90b484f2accf8f8a3a8e /inffast.c | |
parent | 9811b53dd9e8f67015c7199fff12b5bfc6965330 (diff) | |
download | zlib-0484693e1723bbab791c56f95597bd7dbe867d03.tar.gz zlib-0484693e1723bbab791c56f95597bd7dbe867d03.tar.bz2 zlib-0484693e1723bbab791c56f95597bd7dbe867d03.zip |
zlib 1.2.2.2v1.2.2.2
Diffstat (limited to 'inffast.c')
-rw-r--r-- | inffast.c | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -74,6 +74,9 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
74 | unsigned char FAR *out; /* local strm->next_out */ | 74 | unsigned char FAR *out; /* local strm->next_out */ |
75 | unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ | 75 | unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ |
76 | unsigned char FAR *end; /* while out < end, enough space available */ | 76 | unsigned char FAR *end; /* while out < end, enough space available */ |
77 | #ifdef INFLATE_STRICT | ||
78 | unsigned dmax; /* maximum distance from zlib header */ | ||
79 | #endif | ||
77 | unsigned wsize; /* window size or zero if not using window */ | 80 | unsigned wsize; /* window size or zero if not using window */ |
78 | unsigned whave; /* valid bytes in the window */ | 81 | unsigned whave; /* valid bytes in the window */ |
79 | unsigned write; /* window write index */ | 82 | unsigned write; /* window write index */ |
@@ -98,6 +101,9 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
98 | out = strm->next_out - OFF; | 101 | out = strm->next_out - OFF; |
99 | beg = out - (start - strm->avail_out); | 102 | beg = out - (start - strm->avail_out); |
100 | end = out + (strm->avail_out - 257); | 103 | end = out + (strm->avail_out - 257); |
104 | #ifdef INFLATE_STRICT | ||
105 | dmax = state->dmax; | ||
106 | #endif | ||
101 | wsize = state->wsize; | 107 | wsize = state->wsize; |
102 | whave = state->whave; | 108 | whave = state->whave; |
103 | write = state->write; | 109 | write = state->write; |
@@ -167,6 +173,13 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
167 | } | 173 | } |
168 | } | 174 | } |
169 | dist += (unsigned)hold & ((1U << op) - 1); | 175 | dist += (unsigned)hold & ((1U << op) - 1); |
176 | #ifdef INFLATE_STRICT | ||
177 | if (dist > dmax) { | ||
178 | strm->msg = (char *)"invalid distance too far back"; | ||
179 | state->mode = BAD; | ||
180 | break; | ||
181 | } | ||
182 | #endif | ||
170 | hold >>= op; | 183 | hold >>= op; |
171 | bits -= op; | 184 | bits -= op; |
172 | Tracevv((stderr, "inflate: distance %u\n", dist)); | 185 | Tracevv((stderr, "inflate: distance %u\n", dist)); |