zstd: [superblock] Add defensive assert and bounds check
The bound check condition should always be met because we selected `set_basic` as our encoding type. But that code is very far away, so assert it is true so if it is ever false we can catch it, and add a bounds check. Port of facebook/zstd@1047097dad Reported-by: Coverity (CID 1524446) Reviewed-by: Damian Szuberski <szuberskidamian@gmail.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de> Ported-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #14212
This commit is contained in:
parent
eb1ed2a66b
commit
466cf54ecf
|
@ -603,7 +603,7 @@ static size_t ZSTD_estimateSubBlockSize_symbolType(symbolEncodingType_e type,
|
||||||
const BYTE* codeTable, unsigned maxCode,
|
const BYTE* codeTable, unsigned maxCode,
|
||||||
size_t nbSeq, const FSE_CTable* fseCTable,
|
size_t nbSeq, const FSE_CTable* fseCTable,
|
||||||
const U32* additionalBits,
|
const U32* additionalBits,
|
||||||
short const* defaultNorm, U32 defaultNormLog,
|
short const* defaultNorm, U32 defaultNormLog, U32 defaultMax,
|
||||||
void* workspace, size_t wkspSize)
|
void* workspace, size_t wkspSize)
|
||||||
{
|
{
|
||||||
unsigned* const countWksp = (unsigned*)workspace;
|
unsigned* const countWksp = (unsigned*)workspace;
|
||||||
|
@ -615,7 +615,11 @@ static size_t ZSTD_estimateSubBlockSize_symbolType(symbolEncodingType_e type,
|
||||||
|
|
||||||
HIST_countFast_wksp(countWksp, &max, codeTable, nbSeq, workspace, wkspSize); /* can't fail */
|
HIST_countFast_wksp(countWksp, &max, codeTable, nbSeq, workspace, wkspSize); /* can't fail */
|
||||||
if (type == set_basic) {
|
if (type == set_basic) {
|
||||||
cSymbolTypeSizeEstimateInBits = ZSTD_crossEntropyCost(defaultNorm, defaultNormLog, countWksp, max);
|
/* We selected this encoding type, so it must be valid. */
|
||||||
|
assert(max <= defaultMax);
|
||||||
|
cSymbolTypeSizeEstimateInBits = max <= defaultMax
|
||||||
|
? ZSTD_crossEntropyCost(defaultNorm, defaultNormLog, countWksp, max)
|
||||||
|
: ERROR(GENERIC);
|
||||||
} else if (type == set_rle) {
|
} else if (type == set_rle) {
|
||||||
cSymbolTypeSizeEstimateInBits = 0;
|
cSymbolTypeSizeEstimateInBits = 0;
|
||||||
} else if (type == set_compressed || type == set_repeat) {
|
} else if (type == set_compressed || type == set_repeat) {
|
||||||
|
@ -643,15 +647,15 @@ static size_t ZSTD_estimateSubBlockSize_sequences(const BYTE* ofCodeTable,
|
||||||
size_t cSeqSizeEstimate = 0;
|
size_t cSeqSizeEstimate = 0;
|
||||||
cSeqSizeEstimate += ZSTD_estimateSubBlockSize_symbolType(fseMetadata->ofType, ofCodeTable, MaxOff,
|
cSeqSizeEstimate += ZSTD_estimateSubBlockSize_symbolType(fseMetadata->ofType, ofCodeTable, MaxOff,
|
||||||
nbSeq, fseTables->offcodeCTable, NULL,
|
nbSeq, fseTables->offcodeCTable, NULL,
|
||||||
OF_defaultNorm, OF_defaultNormLog,
|
OF_defaultNorm, OF_defaultNormLog, DefaultMaxOff,
|
||||||
workspace, wkspSize);
|
workspace, wkspSize);
|
||||||
cSeqSizeEstimate += ZSTD_estimateSubBlockSize_symbolType(fseMetadata->llType, llCodeTable, MaxLL,
|
cSeqSizeEstimate += ZSTD_estimateSubBlockSize_symbolType(fseMetadata->llType, llCodeTable, MaxLL,
|
||||||
nbSeq, fseTables->litlengthCTable, LL_bits,
|
nbSeq, fseTables->litlengthCTable, LL_bits,
|
||||||
LL_defaultNorm, LL_defaultNormLog,
|
LL_defaultNorm, LL_defaultNormLog, MaxLL,
|
||||||
workspace, wkspSize);
|
workspace, wkspSize);
|
||||||
cSeqSizeEstimate += ZSTD_estimateSubBlockSize_symbolType(fseMetadata->mlType, mlCodeTable, MaxML,
|
cSeqSizeEstimate += ZSTD_estimateSubBlockSize_symbolType(fseMetadata->mlType, mlCodeTable, MaxML,
|
||||||
nbSeq, fseTables->matchlengthCTable, ML_bits,
|
nbSeq, fseTables->matchlengthCTable, ML_bits,
|
||||||
ML_defaultNorm, ML_defaultNormLog,
|
ML_defaultNorm, ML_defaultNormLog, MaxML,
|
||||||
workspace, wkspSize);
|
workspace, wkspSize);
|
||||||
if (writeEntropy) cSeqSizeEstimate += fseMetadata->fseTablesSize;
|
if (writeEntropy) cSeqSizeEstimate += fseMetadata->fseTablesSize;
|
||||||
return cSeqSizeEstimate + sequencesSectionHeaderSize;
|
return cSeqSizeEstimate + sequencesSectionHeaderSize;
|
||||||
|
|
Loading…
Reference in New Issue