aboutsummaryrefslogtreecommitdiff
path: root/inffast.c
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2011-09-09 23:24:33 -0700
committerMark Adler <madler@alumni.caltech.edu>2011-09-09 23:24:33 -0700
commit0484693e1723bbab791c56f95597bd7dbe867d03 (patch)
tree8f31dbed98b4390da74a90b484f2accf8f8a3a8e /inffast.c
parent9811b53dd9e8f67015c7199fff12b5bfc6965330 (diff)
downloadzlib-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.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/inffast.c b/inffast.c
index 8c02a17..bbee92e 100644
--- a/inffast.c
+++ b/inffast.c
@@ -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));