Don't check cur_ix_masked against ring_buffer_mask.

`cur_ix_masked` isn't changing from iteration to iteration, and `max_length` ensures we never find a match long enough to walk off the ring buffer.

PiperOrigin-RevId: 624162764
This commit is contained in:
Brotli 2024-04-12 06:50:04 -07:00 committed by Copybara-Service
parent a813a6a1e4
commit a76d96e730
4 changed files with 11 additions and 13 deletions

View File

@ -557,6 +557,7 @@ static BROTLI_INLINE void FindCompoundDictionaryMatch(
offset = distance_offset - distance; offset = distance_offset - distance;
limit = source_size - offset; limit = source_size - offset;
limit = limit > max_length ? max_length : limit; limit = limit > max_length ? max_length : limit;
BROTLI_DCHECK(cur_ix_masked + limit <= ring_buffer_mask)
len = FindMatchLengthWithLimit(&source[offset], &data[cur_ix_masked], len = FindMatchLengthWithLimit(&source[offset], &data[cur_ix_masked],
limit); limit);
if (len >= 2) { if (len >= 2) {
@ -591,7 +592,7 @@ static BROTLI_INLINE void FindCompoundDictionaryMatch(
limit = source_size - offset; limit = source_size - offset;
limit = (limit > max_length) ? max_length : limit; limit = (limit > max_length) ? max_length : limit;
if (distance > max_distance) continue; if (distance > max_distance) continue;
if (cur_ix_masked + best_len > ring_buffer_mask || best_len >= limit || if (best_len >= limit ||
/* compare 4 bytes ending at best_len + 1 */ /* compare 4 bytes ending at best_len + 1 */
BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) != BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) !=
BrotliUnalignedRead32(&source[offset + best_len - 3])) { BrotliUnalignedRead32(&source[offset + best_len - 3])) {
@ -670,8 +671,7 @@ static BROTLI_INLINE size_t FindAllCompoundDictionaryMatches(
limit = source_size - offset; limit = source_size - offset;
limit = (limit > max_length) ? max_length : limit; limit = (limit > max_length) ? max_length : limit;
if (distance > max_distance) continue; if (distance > max_distance) continue;
if (cur_ix_masked + best_len > ring_buffer_mask || if (best_len >= limit ||
best_len >= limit ||
data[cur_ix_masked + best_len] != source[offset + best_len]) { data[cur_ix_masked + best_len] != source[offset + best_len]) {
continue; continue;
} }

View File

@ -203,6 +203,7 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
uint8_t* BROTLI_RESTRICT tiny_hashes = FN(TinyHash)(self->extra[0]); uint8_t* BROTLI_RESTRICT tiny_hashes = FN(TinyHash)(self->extra[0]);
FN(Bank)* BROTLI_RESTRICT banks = FN(Banks)(self->extra[1]); FN(Bank)* BROTLI_RESTRICT banks = FN(Banks)(self->extra[1]);
const size_t cur_ix_masked = cur_ix & ring_buffer_mask; const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
BROTLI_DCHECK(cur_ix_masked + max_length <= ring_buffer_mask)
/* Don't accept a short copy from far away. */ /* Don't accept a short copy from far away. */
score_t min_score = out->score; score_t min_score = out->score;
score_t best_score = out->score; score_t best_score = out->score;
@ -260,8 +261,7 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
prev_ix = (cur_ix - backward) & ring_buffer_mask; prev_ix = (cur_ix - backward) & ring_buffer_mask;
slot = banks[bank].slots[last].next; slot = banks[bank].slots[last].next;
delta = banks[bank].slots[last].delta; delta = banks[bank].slots[last].delta;
if (cur_ix_masked + best_len > ring_buffer_mask || if (prev_ix + best_len > ring_buffer_mask ||
prev_ix + best_len > ring_buffer_mask ||
/* compare 4 bytes ending at best_len + 1 */ /* compare 4 bytes ending at best_len + 1 */
BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) != BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) !=
BrotliUnalignedRead32(&data[prev_ix + best_len - 3])) { BrotliUnalignedRead32(&data[prev_ix + best_len - 3])) {

View File

@ -165,6 +165,7 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
uint16_t* BROTLI_RESTRICT num = self->num_; uint16_t* BROTLI_RESTRICT num = self->num_;
uint32_t* BROTLI_RESTRICT buckets = self->buckets_; uint32_t* BROTLI_RESTRICT buckets = self->buckets_;
const size_t cur_ix_masked = cur_ix & ring_buffer_mask; const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
BROTLI_DCHECK(cur_ix_masked + max_length <= ring_buffer_mask)
/* Don't accept a short copy from far away. */ /* Don't accept a short copy from far away. */
score_t min_score = out->score; score_t min_score = out->score;
score_t best_score = out->score; score_t best_score = out->score;
@ -184,8 +185,7 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
} }
prev_ix &= ring_buffer_mask; prev_ix &= ring_buffer_mask;
if (cur_ix_masked + best_len > ring_buffer_mask || if (prev_ix + best_len > ring_buffer_mask ||
prev_ix + best_len > ring_buffer_mask ||
data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { data[cur_ix_masked + best_len] != data[prev_ix + best_len]) {
continue; continue;
} }
@ -233,8 +233,7 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
break; break;
} }
prev_ix &= ring_buffer_mask; prev_ix &= ring_buffer_mask;
if (cur_ix_masked + best_len > ring_buffer_mask || if (prev_ix + best_len > ring_buffer_mask ||
prev_ix + best_len > ring_buffer_mask ||
/* compare 4 bytes ending at best_len + 1 */ /* compare 4 bytes ending at best_len + 1 */
BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) != BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) !=
BrotliUnalignedRead32(&data[prev_ix + best_len - 3])) { BrotliUnalignedRead32(&data[prev_ix + best_len - 3])) {

View File

@ -164,6 +164,7 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
uint16_t* BROTLI_RESTRICT num = self->num_; uint16_t* BROTLI_RESTRICT num = self->num_;
uint32_t* BROTLI_RESTRICT buckets = self->buckets_; uint32_t* BROTLI_RESTRICT buckets = self->buckets_;
const size_t cur_ix_masked = cur_ix & ring_buffer_mask; const size_t cur_ix_masked = cur_ix & ring_buffer_mask;
BROTLI_DCHECK(cur_ix_masked + max_length <= ring_buffer_mask)
/* Don't accept a short copy from far away. */ /* Don't accept a short copy from far away. */
score_t min_score = out->score; score_t min_score = out->score;
score_t best_score = out->score; score_t best_score = out->score;
@ -183,8 +184,7 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
} }
prev_ix &= ring_buffer_mask; prev_ix &= ring_buffer_mask;
if (cur_ix_masked + best_len > ring_buffer_mask || if (prev_ix + best_len > ring_buffer_mask ||
prev_ix + best_len > ring_buffer_mask ||
data[cur_ix_masked + best_len] != data[prev_ix + best_len]) { data[cur_ix_masked + best_len] != data[prev_ix + best_len]) {
continue; continue;
} }
@ -228,8 +228,7 @@ static BROTLI_INLINE void FN(FindLongestMatch)(
break; break;
} }
prev_ix &= ring_buffer_mask; prev_ix &= ring_buffer_mask;
if (cur_ix_masked + best_len > ring_buffer_mask || if (prev_ix + best_len > ring_buffer_mask ||
prev_ix + best_len > ring_buffer_mask ||
/* compare 4 bytes ending at best_len + 1 */ /* compare 4 bytes ending at best_len + 1 */
BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) != BrotliUnalignedRead32(&data[cur_ix_masked + best_len - 3]) !=
BrotliUnalignedRead32(&data[prev_ix + best_len - 3])) { BrotliUnalignedRead32(&data[prev_ix + best_len - 3])) {