From 82bc8fe0cc3746d9b02b86c1bddaed842d07f755 Mon Sep 17 00:00:00 2001 From: Nick Terrell Date: Wed, 13 Dec 2017 12:04:46 -0800 Subject: [PATCH] [fileio] Refuse to remove non-regular file --- programs/fileio.c | 12 ++++++++++-- tests/playTests.sh | 8 ++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/programs/fileio.c b/programs/fileio.c index 101c99b1..a0e370ba 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -261,6 +261,10 @@ void FIO_setLdmHashEveryLog(unsigned ldmHashEveryLog) { * @result : Unlink `fileName`, even if it's read-only */ static int FIO_remove(const char* path) { + if (!UTIL_isRegularFile(path)) { + DISPLAYLEVEL(2, "zstd: Refusing to remove non-regular file %s\n", path); + return 0; + } #if defined(_WIN32) || defined(WIN32) /* windows doesn't allow remove read-only files, * so try to make it writable first */ @@ -314,9 +318,13 @@ static FILE* FIO_openDstFile(const char* dstFileName) g_sparseFileSupport = ZSTD_SPARSE_DEFAULT; } - if (strcmp (dstFileName, nulmark)) { /* not /dev/null */ + if (UTIL_isRegularFile(dstFileName)) { + FILE* fCheck; + if (!strcmp(dstFileName, nulmark)) { + EXM_THROW(40, "%s is unexpectedly a regular file", dstFileName); + } /* Check if destination file already exists */ - FILE* const fCheck = fopen( dstFileName, "rb" ); + fCheck = fopen( dstFileName, "rb" ); if (fCheck != NULL) { /* dst file exists, authorization prompt */ fclose(fCheck); if (!g_overwrite) { diff --git a/tests/playTests.sh b/tests/playTests.sh index 299c2d88..402808c0 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -56,10 +56,12 @@ fi isWindows=false INTOVOID="/dev/null" +DEVDEVICE="/dev/zero" case "$OS" in Windows*) isWindows=true INTOVOID="NUL" + DEVDEVICE="NUL" ;; esac @@ -159,6 +161,12 @@ $ZSTD -f --rm tmp test ! -f tmp # tmp should no longer be present $ZSTD -f -d --rm tmp.zst test ! -f tmp.zst # tmp.zst should no longer be present +$ECHO "test : should quietly not remove non-regular file" +$ECHO hello > tmp +$ZSTD tmp -f -o "$DEVDEVICE" 2>tmplog > "$INTOVOID" +grep -v "Refusing to remove non-regular file" tmplog +rm -f tmplog +$ZSTD tmp -f -o "$INTONULL" 2>&1 | grep -v "Refusing to remove non-regular file" $ECHO "test : --rm on stdin" $ECHO a | $ZSTD --rm > $INTOVOID # --rm should remain silent rm tmp