diff --git a/programs/zstdcli.c b/programs/zstdcli.c index a187ffafd..a42fd5605 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -839,6 +839,7 @@ int main(int argCount, const char* argv[]) size_t streamSrcSize = 0; size_t targetCBlockSize = 0; size_t srcSizeHint = 0; + size_t nbInputFileNames = 0; int dictCLevel = g_defaultDictCLevel; unsigned dictSelect = g_defaultSelectivityLevel; #ifndef ZSTD_NODICT @@ -1261,6 +1262,8 @@ int main(int argCount, const char* argv[]) } } + nbInputFileNames = filenames->tableSize; /* saving number of input files */ + if (recursive) { /* at this stage, filenameTable is a list of paths, which can contain both files and directories */ UTIL_expandFNT(&filenames, followLinks); } @@ -1363,7 +1366,17 @@ int main(int argCount, const char* argv[]) #endif /* No input filename ==> use stdin and stdout */ - if (filenames->tableSize == 0) UTIL_refFilename(filenames, stdinmark); + if (filenames->tableSize == 0) { + /* It is possible that the input + was a number of empty directories. In this case + stdin and stdout should not be used */ + if (nbInputFileNames > 0 ){ + DISPLAYLEVEL(1, "please provide correct input file(s) or non-empty directories -- ignored \n"); + CLEAN_RETURN(0); + } + UTIL_refFilename(filenames, stdinmark); + } + if (!strcmp(filenames->fileNames[0], stdinmark) && !outFileName) outFileName = stdoutmark; /* when input is stdin, default output is stdout */ diff --git a/tests/playTests.sh b/tests/playTests.sh index edf344f5b..f04f1da72 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -391,6 +391,11 @@ println "\n===> recursive mode test " # combination of -r with empty list of input file zstd -c -r < tmp > tmp.zst +# combination of -r with empty folder +mkdir -p tmpEmptyDir +zstd -r tmpEmptyDir +rm -rf tmpEmptyDir + println "\n===> file removal" zstd -f --rm tmp