An old inffast.c optimization turns out to not be optimal anymore
with modern compilers, and furthermore was not compliant with the
C standard, for which decrementing a pointer before its allocated
memory is undefined. Per the recommendation of a security audit of
the zlib code by Trail of Bits and TrustInSoft, in support of the
Mozilla Foundation, this "optimization" was removed, in order to
avoid the possibility of undefined behavior.
Change-Id: Icb226a05cd35504c8867bb37bbb79f46340f72e8
-/* Allow machine dependent optimization for post-increment or pre-increment.\r
- Based on testing to date,\r
- Pre-increment preferred for:\r
- - PowerPC G3 (Adler)\r
- - MIPS R5000 (Randers-Pehrson)\r
- Post-increment preferred for:\r
- - none\r
- No measurable difference:\r
- - Pentium III (Anderson)\r
- - M68060 (Nikl)\r
- */\r
-#ifdef POSTINC\r
-# define OFF 0\r
-# define PUP(a) *(a)++\r
-#else\r
-# define OFF 1\r
-# define PUP(a) *++(a)\r
-#endif\r
-\r
/*\r
Decode literal, length, and distance codes and write out the resulting\r
literal and match bytes until either not enough input or output is\r
/*\r
Decode literal, length, and distance codes and write out the resulting\r
literal and match bytes until either not enough input or output is\r
\r
/* copy state to local variables */\r
state = (struct inflate_state FAR *)strm->state;\r
\r
/* copy state to local variables */\r
state = (struct inflate_state FAR *)strm->state;\r
- in = strm->next_in - OFF;\r
last = in + (strm->avail_in - 5);\r
last = in + (strm->avail_in - 5);\r
- out = strm->next_out - OFF;\r
+ out = strm->next_out;\r
beg = out - (start - strm->avail_out);\r
end = out + (strm->avail_out - 257);\r
#ifdef INFLATE_STRICT\r
beg = out - (start - strm->avail_out);\r
end = out + (strm->avail_out - 257);\r
#ifdef INFLATE_STRICT\r
input data or output space */\r
do {\r
if (bits < 15) {\r
input data or output space */\r
do {\r
if (bits < 15) {\r
- hold += (unsigned long)(PUP(in)) << bits;\r
+ hold += (unsigned long)(*in++) << bits;\r
- hold += (unsigned long)(PUP(in)) << bits;\r
+ hold += (unsigned long)(*in++) << bits;\r
bits += 8;\r
}\r
here = lcode[hold & lmask];\r
bits += 8;\r
}\r
here = lcode[hold & lmask];\r
Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\r
"inflate: literal '%c'\n" :\r
"inflate: literal 0x%02x\n", here.val));\r
Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\r
"inflate: literal '%c'\n" :\r
"inflate: literal 0x%02x\n", here.val));\r
- PUP(out) = (unsigned char)(here.val);\r
+ *out++ = (unsigned char)(here.val);\r
}\r
else if (op & 16) { /* length base */\r
len = (unsigned)(here.val);\r
op &= 15; /* number of extra bits */\r
if (op) {\r
if (bits < op) {\r
}\r
else if (op & 16) { /* length base */\r
len = (unsigned)(here.val);\r
op &= 15; /* number of extra bits */\r
if (op) {\r
if (bits < op) {\r
- hold += (unsigned long)(PUP(in)) << bits;\r
+ hold += (unsigned long)(*in++) << bits;\r
bits += 8;\r
}\r
len += (unsigned)hold & ((1U << op) - 1);\r
bits += 8;\r
}\r
len += (unsigned)hold & ((1U << op) - 1);\r
}\r
Tracevv((stderr, "inflate: length %u\n", len));\r
if (bits < 15) {\r
}\r
Tracevv((stderr, "inflate: length %u\n", len));\r
if (bits < 15) {\r
- hold += (unsigned long)(PUP(in)) << bits;\r
+ hold += (unsigned long)(*in++) << bits;\r
- hold += (unsigned long)(PUP(in)) << bits;\r
+ hold += (unsigned long)(*in++) << bits;\r
bits += 8;\r
}\r
here = dcode[hold & dmask];\r
bits += 8;\r
}\r
here = dcode[hold & dmask];\r
dist = (unsigned)(here.val);\r
op &= 15; /* number of extra bits */\r
if (bits < op) {\r
dist = (unsigned)(here.val);\r
op &= 15; /* number of extra bits */\r
if (bits < op) {\r
- hold += (unsigned long)(PUP(in)) << bits;\r
+ hold += (unsigned long)(*in++) << bits;\r
bits += 8;\r
if (bits < op) {\r
bits += 8;\r
if (bits < op) {\r
- hold += (unsigned long)(PUP(in)) << bits;\r
+ hold += (unsigned long)(*in++) << bits;\r
#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\r
if (len <= op - whave) {\r
do {\r
#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\r
if (len <= op - whave) {\r
do {\r
} while (--len);\r
continue;\r
}\r
len -= op - whave;\r
do {\r
} while (--len);\r
continue;\r
}\r
len -= op - whave;\r
do {\r
} while (--op > whave);\r
if (op == 0) {\r
from = out - dist;\r
do {\r
} while (--op > whave);\r
if (op == 0) {\r
from = out - dist;\r
do {\r
- PUP(out) = PUP(from);\r
} while (--len);\r
continue;\r
}\r
#endif\r
}\r
} while (--len);\r
continue;\r
}\r
#endif\r
}\r
if (wnext == 0) { /* very common case */\r
from += wsize - op;\r
if (op < len) { /* some from window */\r
len -= op;\r
do {\r
if (wnext == 0) { /* very common case */\r
from += wsize - op;\r
if (op < len) { /* some from window */\r
len -= op;\r
do {\r
- PUP(out) = PUP(from);\r
} while (--op);\r
from = out - dist; /* rest from output */\r
}\r
} while (--op);\r
from = out - dist; /* rest from output */\r
}\r
if (op < len) { /* some from end of window */\r
len -= op;\r
do {\r
if (op < len) { /* some from end of window */\r
len -= op;\r
do {\r
- PUP(out) = PUP(from);\r
if (wnext < len) { /* some from start of window */\r
op = wnext;\r
len -= op;\r
do {\r
if (wnext < len) { /* some from start of window */\r
op = wnext;\r
len -= op;\r
do {\r
- PUP(out) = PUP(from);\r
} while (--op);\r
from = out - dist; /* rest from output */\r
}\r
} while (--op);\r
from = out - dist; /* rest from output */\r
}\r
if (op < len) { /* some from window */\r
len -= op;\r
do {\r
if (op < len) { /* some from window */\r
len -= op;\r
do {\r
- PUP(out) = PUP(from);\r
} while (--op);\r
from = out - dist; /* rest from output */\r
}\r
}\r
while (len > 2) {\r
} while (--op);\r
from = out - dist; /* rest from output */\r
}\r
}\r
while (len > 2) {\r
- PUP(out) = PUP(from);\r
- PUP(out) = PUP(from);\r
- PUP(out) = PUP(from);\r
+ *out++ = *from++;\r
+ *out++ = *from++;\r
+ *out++ = *from++;\r
len -= 3;\r
}\r
if (len) {\r
len -= 3;\r
}\r
if (len) {\r
- PUP(out) = PUP(from);\r
- PUP(out) = PUP(from);\r
}\r
}\r
else {\r
from = out - dist; /* copy direct from output */\r
do { /* minimum length is three */\r
}\r
}\r
else {\r
from = out - dist; /* copy direct from output */\r
do { /* minimum length is three */\r
- PUP(out) = PUP(from);\r
- PUP(out) = PUP(from);\r
- PUP(out) = PUP(from);\r
+ *out++ = *from++;\r
+ *out++ = *from++;\r
+ *out++ = *from++;\r
len -= 3;\r
} while (len > 2);\r
if (len) {\r
len -= 3;\r
} while (len > 2);\r
if (len) {\r
- PUP(out) = PUP(from);\r
- PUP(out) = PUP(from);\r
hold &= (1U << bits) - 1;\r
\r
/* update state and return */\r
hold &= (1U << bits) - 1;\r
\r
/* update state and return */\r
- strm->next_in = in + OFF;\r
- strm->next_out = out + OFF;\r
+ strm->next_in = in;\r
+ strm->next_out = out;\r
strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));\r
strm->avail_out = (unsigned)(out < end ?\r
257 + (end - out) : 257 - (out - end));\r
strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));\r
strm->avail_out = (unsigned)(out < end ?\r
257 + (end - out) : 257 - (out - end));\r