mirror of
https://github.com/facebook/zstd.git
synced 2025-07-30 22:23:13 +03:00
Implemented "command must be followed by argument" protection
suggested by @terrelln (#375)
This commit is contained in:
@ -208,7 +208,8 @@ int main(int argCount, const char* argv[])
|
|||||||
nextArgumentIsMaxDict=0,
|
nextArgumentIsMaxDict=0,
|
||||||
nextArgumentIsDictID=0,
|
nextArgumentIsDictID=0,
|
||||||
nextArgumentIsFile=0,
|
nextArgumentIsFile=0,
|
||||||
ultra=0;
|
ultra=0,
|
||||||
|
lastCommand = 0;
|
||||||
int cLevel = ZSTDCLI_CLEVEL_DEFAULT;
|
int cLevel = ZSTDCLI_CLEVEL_DEFAULT;
|
||||||
int cLevelLast = 1;
|
int cLevelLast = 1;
|
||||||
unsigned recursive = 0;
|
unsigned recursive = 0;
|
||||||
@ -268,8 +269,8 @@ int main(int argCount, const char* argv[])
|
|||||||
if (!strcmp(argument, "--no-sparse")) { FIO_setSparseWrite(0); continue; }
|
if (!strcmp(argument, "--no-sparse")) { FIO_setSparseWrite(0); continue; }
|
||||||
if (!strcmp(argument, "--test")) { testmode=1; decode=1; continue; }
|
if (!strcmp(argument, "--test")) { testmode=1; decode=1; continue; }
|
||||||
if (!strcmp(argument, "--train")) { dictBuild=1; outFileName=g_defaultDictName; continue; }
|
if (!strcmp(argument, "--train")) { dictBuild=1; outFileName=g_defaultDictName; continue; }
|
||||||
if (!strcmp(argument, "--maxdict")) { nextArgumentIsMaxDict=1; continue; }
|
if (!strcmp(argument, "--maxdict")) { nextArgumentIsMaxDict=1; lastCommand=1; continue; }
|
||||||
if (!strcmp(argument, "--dictID")) { nextArgumentIsDictID=1; continue; }
|
if (!strcmp(argument, "--dictID")) { nextArgumentIsDictID=1; lastCommand=1; continue; }
|
||||||
if (!strcmp(argument, "--keep")) { FIO_setRemoveSrcFile(0); continue; }
|
if (!strcmp(argument, "--keep")) { FIO_setRemoveSrcFile(0); continue; }
|
||||||
if (!strcmp(argument, "--rm")) { FIO_setRemoveSrcFile(1); continue; }
|
if (!strcmp(argument, "--rm")) { FIO_setRemoveSrcFile(1); continue; }
|
||||||
|
|
||||||
@ -287,6 +288,10 @@ int main(int argCount, const char* argv[])
|
|||||||
argument++;
|
argument++;
|
||||||
|
|
||||||
while (argument[0]!=0) {
|
while (argument[0]!=0) {
|
||||||
|
if (lastCommand) {
|
||||||
|
DISPLAY("error : command must be followed by argument \n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
#ifndef ZSTD_NOCOMPRESS
|
#ifndef ZSTD_NOCOMPRESS
|
||||||
/* compression Level */
|
/* compression Level */
|
||||||
if ((*argument>='0') && (*argument<='9')) {
|
if ((*argument>='0') && (*argument<='9')) {
|
||||||
@ -309,7 +314,7 @@ int main(int argCount, const char* argv[])
|
|||||||
case 'c': forceStdout=1; outFileName=stdoutmark; argument++; break;
|
case 'c': forceStdout=1; outFileName=stdoutmark; argument++; break;
|
||||||
|
|
||||||
/* Use file content as dictionary */
|
/* Use file content as dictionary */
|
||||||
case 'D': nextEntryIsDictionary = 1; argument++; break;
|
case 'D': nextEntryIsDictionary = 1; lastCommand = 1; argument++; break;
|
||||||
|
|
||||||
/* Overwrite */
|
/* Overwrite */
|
||||||
case 'f': FIO_overwriteMode(); forceStdout=1; argument++; break;
|
case 'f': FIO_overwriteMode(); forceStdout=1; argument++; break;
|
||||||
@ -330,7 +335,7 @@ int main(int argCount, const char* argv[])
|
|||||||
case 't': testmode=1; decode=1; argument++; break;
|
case 't': testmode=1; decode=1; argument++; break;
|
||||||
|
|
||||||
/* destination file name */
|
/* destination file name */
|
||||||
case 'o': nextArgumentIsOutFileName=1; argument++; break;
|
case 'o': nextArgumentIsOutFileName=1; lastCommand=1; argument++; break;
|
||||||
|
|
||||||
#ifdef UTIL_HAS_CREATEFILELIST
|
#ifdef UTIL_HAS_CREATEFILELIST
|
||||||
/* recursive */
|
/* recursive */
|
||||||
@ -394,6 +399,7 @@ int main(int argCount, const char* argv[])
|
|||||||
|
|
||||||
if (nextArgumentIsMaxDict) {
|
if (nextArgumentIsMaxDict) {
|
||||||
nextArgumentIsMaxDict = 0;
|
nextArgumentIsMaxDict = 0;
|
||||||
|
lastCommand = 0;
|
||||||
maxDictSize = readU32FromChar(&argument);
|
maxDictSize = readU32FromChar(&argument);
|
||||||
if (toupper(*argument)=='K') maxDictSize <<= 10;
|
if (toupper(*argument)=='K') maxDictSize <<= 10;
|
||||||
if (toupper(*argument)=='M') maxDictSize <<= 20;
|
if (toupper(*argument)=='M') maxDictSize <<= 20;
|
||||||
@ -402,6 +408,7 @@ int main(int argCount, const char* argv[])
|
|||||||
|
|
||||||
if (nextArgumentIsDictID) {
|
if (nextArgumentIsDictID) {
|
||||||
nextArgumentIsDictID = 0;
|
nextArgumentIsDictID = 0;
|
||||||
|
lastCommand = 0;
|
||||||
dictID = readU32FromChar(&argument);
|
dictID = readU32FromChar(&argument);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -410,12 +417,14 @@ int main(int argCount, const char* argv[])
|
|||||||
|
|
||||||
if (nextEntryIsDictionary) {
|
if (nextEntryIsDictionary) {
|
||||||
nextEntryIsDictionary = 0;
|
nextEntryIsDictionary = 0;
|
||||||
|
lastCommand = 0;
|
||||||
dictFileName = argument;
|
dictFileName = argument;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nextArgumentIsOutFileName) {
|
if (nextArgumentIsOutFileName) {
|
||||||
nextArgumentIsOutFileName = 0;
|
nextArgumentIsOutFileName = 0;
|
||||||
|
lastCommand = 0;
|
||||||
outFileName = argument;
|
outFileName = argument;
|
||||||
if (!strcmp(outFileName, "-")) outFileName = stdoutmark;
|
if (!strcmp(outFileName, "-")) outFileName = stdoutmark;
|
||||||
continue;
|
continue;
|
||||||
|
@ -54,6 +54,14 @@ $ZSTD -99 -f tmp # too large compression level, automatic sized down
|
|||||||
$ECHO "test : compress to stdout"
|
$ECHO "test : compress to stdout"
|
||||||
$ZSTD tmp -c > tmpCompressed
|
$ZSTD tmp -c > tmpCompressed
|
||||||
$ZSTD tmp --stdout > tmpCompressed # long command format
|
$ZSTD tmp --stdout > tmpCompressed # long command format
|
||||||
|
$ECHO "test : compress to named file"
|
||||||
|
rm tmpCompressed
|
||||||
|
$ZSTD tmp -o tmpCompressed
|
||||||
|
ls tmpCompressed # must work
|
||||||
|
$ECHO "test : -o must be followed by filename (must fail)"
|
||||||
|
$ZSTD tmp -of tmpCompressed && die "-o must be followed by filename"
|
||||||
|
$ECHO "test : force write, correct order"
|
||||||
|
$ZSTD tmp -fo tmpCompressed
|
||||||
$ECHO "test : implied stdout when input is stdin"
|
$ECHO "test : implied stdout when input is stdin"
|
||||||
$ECHO bob | $ZSTD | $ZSTD -d
|
$ECHO bob | $ZSTD | $ZSTD -d
|
||||||
$ECHO "test : null-length file roundtrip"
|
$ECHO "test : null-length file roundtrip"
|
||||||
@ -183,18 +191,26 @@ $ECHO "- Create first dictionary"
|
|||||||
$ZSTD --train *.c ../programs/*.c -o tmpDict
|
$ZSTD --train *.c ../programs/*.c -o tmpDict
|
||||||
cp $TESTFILE tmp
|
cp $TESTFILE tmp
|
||||||
$ZSTD -f tmp -D tmpDict
|
$ZSTD -f tmp -D tmpDict
|
||||||
$ZSTD -d tmp.zst -D tmpDict -of result
|
$ZSTD -d tmp.zst -D tmpDict -fo result
|
||||||
diff $TESTFILE result
|
diff $TESTFILE result
|
||||||
$ECHO "- Create second (different) dictionary"
|
$ECHO "- Create second (different) dictionary"
|
||||||
$ZSTD --train *.c ../programs/*.c ../programs/*.h -o tmpDictC
|
$ZSTD --train *.c ../programs/*.c ../programs/*.h -o tmpDictC
|
||||||
$ZSTD -d tmp.zst -D tmpDictC -of result && die "wrong dictionary not detected!"
|
$ZSTD -d tmp.zst -D tmpDictC -fo result && die "wrong dictionary not detected!"
|
||||||
$ECHO "- Create dictionary with short dictID"
|
$ECHO "- Create dictionary with short dictID"
|
||||||
$ZSTD --train *.c ../programs/*.c --dictID 1 -o tmpDict1
|
$ZSTD --train *.c ../programs/*.c --dictID 1 -o tmpDict1
|
||||||
cmp tmpDict tmpDict1 && die "dictionaries should have different ID !"
|
cmp tmpDict tmpDict1 && die "dictionaries should have different ID !"
|
||||||
|
$ECHO "- Create dictionary with wrong dictID parameter order (must fail)"
|
||||||
|
$ZSTD --train *.c ../programs/*.c --dictID -o 1 tmpDict1 && die "wrong order : --dictID must be followed by argument "
|
||||||
|
$ECHO "- Create dictionary with size limit"
|
||||||
|
$ZSTD --train *.c ../programs/*.c -o tmpDict2 --maxdict 4K -v
|
||||||
|
$ECHO "- Create dictionary with wrong parameter order (must fail)"
|
||||||
|
$ZSTD --train *.c ../programs/*.c -o tmpDict2 --maxdict -v 4K && die "wrong order : --maxdict must be followed by argument "
|
||||||
$ECHO "- Compress without dictID"
|
$ECHO "- Compress without dictID"
|
||||||
$ZSTD -f tmp -D tmpDict1 --no-dictID
|
$ZSTD -f tmp -D tmpDict1 --no-dictID
|
||||||
$ZSTD -d tmp.zst -D tmpDict -of result
|
$ZSTD -d tmp.zst -D tmpDict -fo result
|
||||||
diff $TESTFILE result
|
diff $TESTFILE result
|
||||||
|
$ECHO "- Compress with wrong argument order (must fail)"
|
||||||
|
$ZSTD tmp -Df tmpDict1 -c > /dev/null && die "-D must be followed by dictionary name "
|
||||||
$ECHO "- Compress multiple files with dictionary"
|
$ECHO "- Compress multiple files with dictionary"
|
||||||
rm -rf dirTestDict
|
rm -rf dirTestDict
|
||||||
mkdir dirTestDict
|
mkdir dirTestDict
|
||||||
|
Reference in New Issue
Block a user