mirror of
https://github.com/facebook/zstd.git
synced 2025-07-30 22:23:13 +03:00
fixed another invalid scenario
compressSequencesAndLiterals() doesn't support sequence validation
This commit is contained in:
2
.github/workflows/dev-long-tests.yml
vendored
2
.github/workflows/dev-long-tests.yml
vendored
@ -188,7 +188,7 @@ jobs:
|
|||||||
- name: ASan + UBSan + Regression Test
|
- name: ASan + UBSan + Regression Test
|
||||||
run: make -j uasanregressiontest
|
run: make -j uasanregressiontest
|
||||||
|
|
||||||
clang-ubsan-regression:
|
clang-asan-ubsan-regression:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
|
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1
|
||||||
|
@ -263,9 +263,10 @@ corpora: $(patsubst %,corpora/%,$(FUZZ_TARGETS))
|
|||||||
.PHONY: seedcorpora
|
.PHONY: seedcorpora
|
||||||
seedcorpora: $(patsubst %,corpora/%_seed_corpus.zip,$(FUZZ_TARGETS))
|
seedcorpora: $(patsubst %,corpora/%_seed_corpus.zip,$(FUZZ_TARGETS))
|
||||||
|
|
||||||
|
REGRESSION_TARGET ?= all
|
||||||
regressiontest: corpora
|
regressiontest: corpora
|
||||||
CC="$(CC)" CXX="$(CXX)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" $(PYTHON) ./fuzz.py build all --debug=$(DEBUGLEVEL)
|
CC="$(CC)" CXX="$(CXX)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" LDFLAGS="$(LDFLAGS)" $(PYTHON) ./fuzz.py build $(REGRESSION_TARGET) --debug=$(DEBUGLEVEL)
|
||||||
$(PYTHON) ./fuzz.py regression all
|
$(PYTHON) ./fuzz.py regression $(REGRESSION_TARGET)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@$(RM) *.a *.o $(FUZZ_TARGETS)
|
@$(RM) *.a *.o $(FUZZ_TARGETS)
|
||||||
|
@ -77,9 +77,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *src, size_t size)
|
|||||||
FUZZ_dataProducer_uint32Range(producer, 0, 2);
|
FUZZ_dataProducer_uint32Range(producer, 0, 2);
|
||||||
size = FUZZ_dataProducer_remainingBytes(producer);
|
size = FUZZ_dataProducer_remainingBytes(producer);
|
||||||
|
|
||||||
DEBUGLOG(2, "Dict load method %d", dlm);
|
DEBUGLOG(4, "Dict load method %d", dlm);
|
||||||
DEBUGLOG(2, "Dict content type %d", dct);
|
DEBUGLOG(4, "Dict content type %d", dct);
|
||||||
DEBUGLOG(2, "Dict size %u", (unsigned)size);
|
DEBUGLOG(4, "Dict size %u", (unsigned)size);
|
||||||
|
|
||||||
void* const rBuf = FUZZ_malloc(size);
|
void* const rBuf = FUZZ_malloc(size);
|
||||||
size_t const cBufSize = ZSTD_compressBound(size);
|
size_t const cBufSize = ZSTD_compressBound(size);
|
||||||
|
@ -239,8 +239,8 @@ transferLiterals(void* dst, size_t dstCapacity, const ZSTD_Sequence* seqs, size_
|
|||||||
for (n=0; n<nbSeqs; n++) {
|
for (n=0; n<nbSeqs; n++) {
|
||||||
size_t litLen = seqs[n].litLength;
|
size_t litLen = seqs[n].litLength;
|
||||||
size_t mlen = seqs[n].matchLength;
|
size_t mlen = seqs[n].matchLength;
|
||||||
assert(op + litLen < oend);
|
assert(op + litLen < oend); (void)oend;
|
||||||
assert(ip + litLen + mlen <= iend);
|
assert(ip + litLen + mlen <= iend); (void)iend;
|
||||||
memcpy(op, ip, litLen);
|
memcpy(op, ip, litLen);
|
||||||
op += litLen;
|
op += litLen;
|
||||||
ip += litLen + mlen;
|
ip += litLen + mlen;
|
||||||
@ -253,8 +253,7 @@ static size_t roundTripTest_compressSequencesAndLiterals(
|
|||||||
void* result, size_t resultCapacity,
|
void* result, size_t resultCapacity,
|
||||||
void* compressed, size_t compressedCapacity,
|
void* compressed, size_t compressedCapacity,
|
||||||
const void* src, size_t srcSize,
|
const void* src, size_t srcSize,
|
||||||
const ZSTD_Sequence* seqs, size_t nbSeqs,
|
const ZSTD_Sequence* seqs, size_t nbSeqs)
|
||||||
ZSTD_SequenceFormat_e mode)
|
|
||||||
{
|
{
|
||||||
size_t const litCapacity = srcSize + 8;
|
size_t const litCapacity = srcSize + 8;
|
||||||
void* literals = malloc(litCapacity);
|
void* literals = malloc(litCapacity);
|
||||||
@ -267,21 +266,21 @@ static size_t roundTripTest_compressSequencesAndLiterals(
|
|||||||
compressed, compressedCapacity,
|
compressed, compressedCapacity,
|
||||||
seqs, nbSeqs,
|
seqs, nbSeqs,
|
||||||
literals, litSize, litCapacity, srcSize);
|
literals, litSize, litCapacity, srcSize);
|
||||||
if ( (ZSTD_getErrorCode(cSize) == ZSTD_error_dstSize_tooSmall)
|
free(literals);
|
||||||
&& (mode == ZSTD_sf_explicitBlockDelimiters) ) {
|
if (ZSTD_getErrorCode(cSize) == ZSTD_error_cannotProduce_uncompressedBlock) {
|
||||||
|
/* Valid scenario : ZSTD_compressSequencesAndLiterals cannot generate uncompressed blocks */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (ZSTD_getErrorCode(cSize) == ZSTD_error_dstSize_tooSmall) {
|
||||||
/* Valid scenario : in explicit delimiter mode,
|
/* Valid scenario : in explicit delimiter mode,
|
||||||
* it might be possible for the compressed size to outgrow dstCapacity.
|
* it might be possible for the compressed size to outgrow dstCapacity.
|
||||||
* In which case, it's still a valid fuzzer scenario,
|
* In which case, it's still a valid fuzzer scenario,
|
||||||
* but no roundtrip shall be possible */
|
* but no roundtrip shall be possible */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* round-trip */
|
/* round-trip */
|
||||||
if (ZSTD_isError(cSize)) {
|
FUZZ_ZASSERT(cSize);
|
||||||
ZSTD_ErrorCode err = ZSTD_getErrorCode(cSize);
|
|
||||||
/* this specific error might happen as a result of data being uncompressible */
|
|
||||||
if (err != ZSTD_error_cannotProduce_uncompressedBlock)
|
|
||||||
FUZZ_ZASSERT(cSize);
|
|
||||||
}
|
|
||||||
{ size_t const dSize = ZSTD_decompressDCtx(dctx, result, resultCapacity, compressed, cSize);
|
{ size_t const dSize = ZSTD_decompressDCtx(dctx, result, resultCapacity, compressed, cSize);
|
||||||
FUZZ_ZASSERT(dSize);
|
FUZZ_ZASSERT(dSize);
|
||||||
FUZZ_ASSERT_MSG(dSize == srcSize, "Incorrect regenerated size");
|
FUZZ_ASSERT_MSG(dSize == srcSize, "Incorrect regenerated size");
|
||||||
@ -305,11 +304,12 @@ static size_t roundTripTest(void* result, size_t resultCapacity,
|
|||||||
FUZZ_ZASSERT(ZSTD_DCtx_refDDict(dctx, ddict));
|
FUZZ_ZASSERT(ZSTD_DCtx_refDDict(dctx, ddict));
|
||||||
}
|
}
|
||||||
|
|
||||||
{ int blockMode;
|
{ int blockMode, validation;
|
||||||
/* compressSequencesAndLiterals() only supports explicitBlockDelimiters */
|
/* compressSequencesAndLiterals() only supports explicitBlockDelimiters and no validation */
|
||||||
FUZZ_ZASSERT(ZSTD_CCtx_getParameter(cctx, ZSTD_c_blockDelimiters, &blockMode));
|
FUZZ_ZASSERT(ZSTD_CCtx_getParameter(cctx, ZSTD_c_blockDelimiters, &blockMode));
|
||||||
if (blockMode == ZSTD_sf_explicitBlockDelimiters) {
|
FUZZ_ZASSERT(ZSTD_CCtx_getParameter(cctx, ZSTD_c_validateSequences, &validation));
|
||||||
FUZZ_ZASSERT(roundTripTest_compressSequencesAndLiterals(result, resultCapacity, compressed, compressedCapacity, src, srcSize, seqs, nbSeqs, mode));
|
if ((blockMode == ZSTD_sf_explicitBlockDelimiters) && (!validation)) {
|
||||||
|
FUZZ_ZASSERT(roundTripTest_compressSequencesAndLiterals(result, resultCapacity, compressed, compressedCapacity, src, srcSize, seqs, nbSeqs));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user