summaryrefslogtreecommitdiff
path: root/inffast.c
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2011-09-09 23:22:37 -0700
committerMark Adler <madler@alumni.caltech.edu>2011-09-09 23:22:37 -0700
commit4b5a43a219d51066c01ff2ab86af18b967f2d0dd (patch)
tree4dcaf0cd18751d04cf638a9a6ec521990d4f2e90 /inffast.c
parent086e982175da84b3db958191031380794315f95f (diff)
downloadzlib-4b5a43a219d51066c01ff2ab86af18b967f2d0dd.tar.gz
zlib 1.2.0.5v1.2.0.5
Diffstat (limited to 'inffast.c')
-rw-r--r--inffast.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/inffast.c b/inffast.c
index 59a8af8..513b1af 100644
--- a/inffast.c
+++ b/inffast.c
@@ -8,6 +8,8 @@
#include "inflate.h"
#include "inffast.h"
+#ifndef ASMINF
+
/* Allow machine dependent optimization for post-increment or pre-increment.
Based on testing to date,
Pre-increment preferred for:
@@ -72,6 +74,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
unsigned char FAR *end; /* while out < end, enough space available */
unsigned wsize; /* window size or zero if not using window */
+ unsigned whave; /* valid bytes in the window */
unsigned write; /* window write index */
unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */
unsigned long hold; /* local strm->hold */
@@ -95,6 +98,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
beg = out - (start - strm->avail_out);
end = out + (strm->avail_out - 257);
wsize = state->wsize;
+ whave = state->whave;
write = state->write;
window = state->window;
hold = state->hold;
@@ -167,13 +171,13 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
Tracevv((stderr, "inflate: distance %u\n", dist));
op = (unsigned)(out - beg); /* max distance in output */
if (dist > op) { /* see if copy from window */
- if (dist > wsize) {
+ op = dist - op; /* distance back in window */
+ if (op > whave) {
strm->msg = (char *)"invalid distance too far back";
state->mode = BAD;
break;
}
from = window - OFF;
- op = dist - op; /* distance back in window */
if (write == 0) { /* very common case */
from += wsize - op;
if (op < len) { /* some from window */
@@ -296,3 +300,5 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
- Larger unrolled copy loops (three is about right)
- Moving len -= 3 statement into middle of loop
*/
+
+#endif /* !ASMINF */