Skip to content

Commit d1d5774

Browse files
committed
Avoid pre-decrement of pointer in big-endian CRC calculation.
There was a small optimization for PowerPCs to pre-increment a pointer when accessing a word, instead of post-incrementing. This required prefacing the loop with a decrement of the pointer, possibly pointing before the object passed. This is not compliant with the C standard, for which decrementing a pointer before its allocated memory is undefined. When tested on a modern PowerPC with a modern compiler, the optimization no longer has any effect. Due to all that, and 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.
1 parent 6a04314 commit d1d5774

File tree

1 file changed

+1
-3
lines changed

1 file changed

+1
-3
lines changed

crc32.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ local unsigned long crc32_little(crc, buf, len)
278278
}
279279

280280
/* ========================================================================= */
281-
#define DOBIG4 c ^= *++buf4; \
281+
#define DOBIG4 c ^= *buf4++; \
282282
c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
283283
crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
284284
#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
@@ -300,7 +300,6 @@ local unsigned long crc32_big(crc, buf, len)
300300
}
301301

302302
buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
303-
buf4--;
304303
while (len >= 32) {
305304
DOBIG32;
306305
len -= 32;
@@ -309,7 +308,6 @@ local unsigned long crc32_big(crc, buf, len)
309308
DOBIG4;
310309
len -= 4;
311310
}
312-
buf4++;
313311
buf = (const unsigned char FAR *)buf4;
314312

315313
if (len) do {

0 commit comments

Comments
 (0)