Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ZSTD_fast_noDict: Avoid Safety Check When Writing ip1 into Table #3129

Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 18 additions & 3 deletions lib/compress/zstd_fast.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,23 @@ ZSTD_compressBlock_fast_noDict_generic(
/* check match at ip[0] */
if (MEM_read32(ip0) == mval) {
/* found a match! */
if (step > 4) {
/* We need to avoid writing an index into the hash table >= the
* position at which we will pick up our searching after we've
* taken this match.
*
* The minimum possible match has length 4, so the earliest ip0
* can be after we take this match will be the current ip0 + 4.
* ip1 is ip0 + step - 1. If ip1 is >= ip0 + 4, we can't safely
* write this position. The expedient thing to do is just to
* write a bad position.
*
* We perform this check here, separate from the write, because
* this is the only match path where this can occur. (In rep-
* code and the first match checks, ip1 == ip0 + 1.)
*/
ip1 = base;
}
goto _offset;
}

Expand Down Expand Up @@ -288,9 +305,7 @@ ZSTD_compressBlock_fast_noDict_generic(
anchor = ip0;

/* write next hash table entry */
if (ip1 < ip0) {
hashTable[hash1] = (U32)(ip1 - base);
}
hashTable[hash1] = (U32)(ip1 - base);
felixhandte marked this conversation as resolved.
Show resolved Hide resolved

/* Fill table and check for immediate repcode. */
if (ip0 <= ilimit) {
Expand Down