Skip to content

Commit

Permalink
Reject Irregular Dictionary Files
Browse files Browse the repository at this point in the history
I hadn't seen #2890, so I wrote my own version. I like this approach a little
better, since it does an explicit check for a regular file, rather than
passing a magic value.

Addresses #2874.
  • Loading branch information
felixhandte committed Dec 7, 2021
1 parent e7b0ae3 commit a0d0763
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 5 deletions.
21 changes: 16 additions & 5 deletions programs/fileio.c
Original file line number Diff line number Diff line change
Expand Up @@ -732,22 +732,33 @@ static size_t FIO_createDictBuffer(void** bufferPtr, const char* fileName, FIO_p
{
FILE* fileHandle;
U64 fileSize;
stat_t statbuf;

assert(bufferPtr != NULL);
*bufferPtr = NULL;
if (fileName == NULL) return 0;

DISPLAYLEVEL(4,"Loading %s as dictionary \n", fileName);

if (!UTIL_stat(fileName, &statbuf)) {
EXM_THROW(31, "Stat failed on dictionary file %s.", fileName);
}

if (!UTIL_isRegularFileStat(&statbuf)) {
EXM_THROW(32, "Dictionary %s must be a regular file.", fileName);
}

fileHandle = fopen(fileName, "rb");
if (fileHandle==NULL) EXM_THROW(31, "%s: %s", fileName, strerror(errno));

fileSize = UTIL_getFileSize(fileName);
if (fileSize == UTIL_FILESIZE_UNKNOWN)
EXM_THROW(32, "This file format is not supported : Dictionary file %s\n", fileName);
if (fileHandle == NULL) {
EXM_THROW(33, "Couldn't open dictionary %s: %s", fileName, strerror(errno));
}

fileSize = UTIL_getFileSizeStat(&statbuf);
{
size_t const dictSizeMax = prefs->patchFromMode ? prefs->memLimit : DICTSIZE_MAX;
if (fileSize > dictSizeMax) {
EXM_THROW(32, "Dictionary file %s is too large (> %u bytes)",
EXM_THROW(34, "Dictionary file %s is too large (> %u bytes)",
fileName, (unsigned)dictSizeMax); /* avoid extreme cases */
}
}
Expand Down
5 changes: 5 additions & 0 deletions tests/playTests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -974,6 +974,11 @@ println "- Dictionary compression with btlazy2 strategy"
zstd -f tmp -D tmpDict --zstd=strategy=6
zstd -d tmp.zst -D tmpDict -fo result
$DIFF "$TESTFILE" result
if [ -e /dev/stdin ]; then
println "- Test rejecting irregular dictionary file"
cat tmpDict | zstd -f tmp -D /dev/stdin 2>&1 | grep 'regular file' || die "Correct error message not detected!"
cat tmpDict | zstd -d tmp.zst -D /dev/stdin -f 2>&1 | grep 'regular file' || die "Correct error message not detected!"
fi
if [ -n "$hasMT" ]
then
println "- Test dictionary compression with multithreading "
Expand Down

0 comments on commit a0d0763

Please sign in to comment.