diff --git a/programs/fileio.c b/programs/fileio.c index 29a2d66aac..a7f0db5ffa 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -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 */ } } diff --git a/tests/playTests.sh b/tests/playTests.sh index 6dbfffca20..2262c78111 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -974,6 +974,9 @@ 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 +println "- Test rejecting irregular dictionary file" +zstd -f tmp -D /dev/null 2>&1 | grep 'regular file' || die "Correct error message not detected!" +zstd -d tmp.zst -D /dev/null -f 2>&1 | grep 'regular file' || die "Correct error message not detected!" if [ -n "$hasMT" ] then println "- Test dictionary compression with multithreading "