mirror of
https://github.com/facebook/zstd.git
synced 2025-03-07 01:10:04 +02:00
Reject Irregular Dictionary Files
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.
This commit is contained in:
parent
e7b0ae385e
commit
9985e10fda
@ -732,31 +732,43 @@ 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);
|
||||
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 (!UTIL_stat(fileName, &statbuf)) {
|
||||
EXM_THROW(31, "Stat failed on dictionary file %s: %s", fileName, strerror(errno));
|
||||
}
|
||||
|
||||
if (!UTIL_isRegularFileStat(&statbuf)) {
|
||||
EXM_THROW(32, "Dictionary %s must be a regular file.", fileName);
|
||||
}
|
||||
|
||||
fileHandle = fopen(fileName, "rb");
|
||||
|
||||
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 */
|
||||
}
|
||||
}
|
||||
*bufferPtr = malloc((size_t)fileSize);
|
||||
if (*bufferPtr==NULL) EXM_THROW(34, "%s", strerror(errno));
|
||||
{ size_t const readSize = fread(*bufferPtr, 1, (size_t)fileSize, fileHandle);
|
||||
if (readSize != fileSize)
|
||||
if (readSize != fileSize) {
|
||||
EXM_THROW(35, "Error reading dictionary file %s : %s",
|
||||
fileName, strerror(errno));
|
||||
}
|
||||
}
|
||||
fclose(fileHandle);
|
||||
return (size_t)fileSize;
|
||||
|
@ -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 /proc/self/fd/0 ]; then
|
||||
println "- Test rejecting irregular dictionary file"
|
||||
cat tmpDict | zstd -f tmp -D /proc/self/fd/0 && die "Piped dictionary should fail!"
|
||||
cat tmpDict | zstd -d tmp.zst -D /proc/self/fd/0 -f && die "Piped dictionary should fail!"
|
||||
fi
|
||||
if [ -n "$hasMT" ]
|
||||
then
|
||||
println "- Test dictionary compression with multithreading "
|
||||
|
Loading…
x
Reference in New Issue
Block a user