diff options
author | Mark Adler <madler@alumni.caltech.edu> | 2011-09-09 23:22:37 -0700 |
---|---|---|
committer | Mark Adler <madler@alumni.caltech.edu> | 2011-09-09 23:22:37 -0700 |
commit | 4b5a43a219d51066c01ff2ab86af18b967f2d0dd (patch) | |
tree | 4dcaf0cd18751d04cf638a9a6ec521990d4f2e90 /inffast.c | |
parent | 086e982175da84b3db958191031380794315f95f (diff) | |
download | zlib-4b5a43a219d51066c01ff2ab86af18b967f2d0dd.tar.gz zlib-4b5a43a219d51066c01ff2ab86af18b967f2d0dd.tar.bz2 zlib-4b5a43a219d51066c01ff2ab86af18b967f2d0dd.zip |
zlib 1.2.0.5v1.2.0.5
Diffstat (limited to 'inffast.c')
-rw-r--r-- | inffast.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -8,6 +8,8 @@ | |||
8 | #include "inflate.h" | 8 | #include "inflate.h" |
9 | #include "inffast.h" | 9 | #include "inffast.h" |
10 | 10 | ||
11 | #ifndef ASMINF | ||
12 | |||
11 | /* Allow machine dependent optimization for post-increment or pre-increment. | 13 | /* Allow machine dependent optimization for post-increment or pre-increment. |
12 | Based on testing to date, | 14 | Based on testing to date, |
13 | Pre-increment preferred for: | 15 | Pre-increment preferred for: |
@@ -72,6 +74,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
72 | unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ | 74 | unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ |
73 | unsigned char FAR *end; /* while out < end, enough space available */ | 75 | unsigned char FAR *end; /* while out < end, enough space available */ |
74 | unsigned wsize; /* window size or zero if not using window */ | 76 | unsigned wsize; /* window size or zero if not using window */ |
77 | unsigned whave; /* valid bytes in the window */ | ||
75 | unsigned write; /* window write index */ | 78 | unsigned write; /* window write index */ |
76 | unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ | 79 | unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ |
77 | unsigned long hold; /* local strm->hold */ | 80 | unsigned long hold; /* local strm->hold */ |
@@ -95,6 +98,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
95 | beg = out - (start - strm->avail_out); | 98 | beg = out - (start - strm->avail_out); |
96 | end = out + (strm->avail_out - 257); | 99 | end = out + (strm->avail_out - 257); |
97 | wsize = state->wsize; | 100 | wsize = state->wsize; |
101 | whave = state->whave; | ||
98 | write = state->write; | 102 | write = state->write; |
99 | window = state->window; | 103 | window = state->window; |
100 | hold = state->hold; | 104 | hold = state->hold; |
@@ -167,13 +171,13 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
167 | Tracevv((stderr, "inflate: distance %u\n", dist)); | 171 | Tracevv((stderr, "inflate: distance %u\n", dist)); |
168 | op = (unsigned)(out - beg); /* max distance in output */ | 172 | op = (unsigned)(out - beg); /* max distance in output */ |
169 | if (dist > op) { /* see if copy from window */ | 173 | if (dist > op) { /* see if copy from window */ |
170 | if (dist > wsize) { | 174 | op = dist - op; /* distance back in window */ |
175 | if (op > whave) { | ||
171 | strm->msg = (char *)"invalid distance too far back"; | 176 | strm->msg = (char *)"invalid distance too far back"; |
172 | state->mode = BAD; | 177 | state->mode = BAD; |
173 | break; | 178 | break; |
174 | } | 179 | } |
175 | from = window - OFF; | 180 | from = window - OFF; |
176 | op = dist - op; /* distance back in window */ | ||
177 | if (write == 0) { /* very common case */ | 181 | if (write == 0) { /* very common case */ |
178 | from += wsize - op; | 182 | from += wsize - op; |
179 | if (op < len) { /* some from window */ | 183 | if (op < len) { /* some from window */ |
@@ -296,3 +300,5 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
296 | - Larger unrolled copy loops (three is about right) | 300 | - Larger unrolled copy loops (three is about right) |
297 | - Moving len -= 3 statement into middle of loop | 301 | - Moving len -= 3 statement into middle of loop |
298 | */ | 302 | */ |
303 | |||
304 | #endif /* !ASMINF */ | ||