chain_length >>= 2;
/*
- * Do not looks for matches beyond the end of the input. This is
+ * Do not look for matches beyond the end of the input. This is
* necessary to make deflate deterministic
*/
nice_match = (unsigned int)s->nice_match > s->lookahead ? s->lookahead : s->nice_match;
scan = s->window + s->strstart;
strend = s->window + s->strstart + MAX_MATCH - 1;
- scan_start = *(uint16_t *)scan;
- scan_end = *(uint16_t *)(scan + best_len-1);
+ memcpy(&scan_start, scan, sizeof(scan_start));
+ memcpy(&scan_end, scan + best_len - 1, sizeof(scan_end));
Assert((unsigned long)s->strstart <= s->window_size - MIN_LOOKAHEAD, "need lookahead");
do {
* is limited to the lookahead, so the output of deflate is not
* affected by the uninitialized values.
*/
- if (likely((*(uint16_t *)(match + best_len - 1) != scan_end)))
+ uint16_t val;
+ memcpy(&val, match + best_len - 1, sizeof(val));
+ if (likely(val != scan_end))
continue;
- if (*(uint16_t *)match != scan_start)
+
+ memcpy(&val, match, sizeof(val));
+ if (val != scan_start)
continue;
/* It is not necessary to compare scan[2] and match[2] since
match++;
do {
- } while (*(uint16_t *)(scan += 2)== *(uint16_t *)(match += 2) &&
- *(uint16_t *)(scan += 2)== *(uint16_t *)(match += 2) &&
- *(uint16_t *)(scan += 2)== *(uint16_t *)(match += 2) &&
- *(uint16_t *)(scan += 2)== *(uint16_t *)(match += 2) &&
- scan < strend);
+ uint16_t mval, sval;
+
+ memcpy(&mval, match, sizeof(mval));
+ memcpy(&sval, scan, sizeof(sval));
+ if (mval != sval)
+ break;
+ match += sizeof(mval);
+ scan += sizeof(sval);
+
+ memcpy(&mval, match, sizeof(mval));
+ memcpy(&sval, scan, sizeof(sval));
+ if (mval != sval)
+ break;
+ match += sizeof(mval);
+ scan += sizeof(sval);
+
+ memcpy(&mval, match, sizeof(mval));
+ memcpy(&sval, scan, sizeof(sval));
+ if (mval != sval)
+ break;
+ match += sizeof(mval);
+ scan += sizeof(sval);
+
+ memcpy(&mval, match, sizeof(mval));
+ memcpy(&sval, scan, sizeof(sval));
+ if (mval != sval)
+ break;
+ match += sizeof(mval);
+ scan += sizeof(sval);
+ } while (scan < strend);
/*
* Here, scan <= window + strstart + 257
best_len = len;
if (len >= nice_match)
break;
- scan_end = *(uint16_t *)(scan + best_len - 1);
+ memcpy(&scan_end, scan + best_len - 1, sizeof(scan_end));
} else {
/*
* The probability of finding a match later if we here