]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
[fileio] Refuse to remove non-regular file 949/head
authorNick Terrell <terrelln@fb.com>
Wed, 13 Dec 2017 20:04:46 +0000 (12:04 -0800)
committerNick Terrell <terrelln@fb.com>
Wed, 13 Dec 2017 21:38:26 +0000 (13:38 -0800)
programs/fileio.c
tests/playTests.sh

index 101c99b1ae834183cdfbd3aacd4a2d6bcf66f697..a0e370bac5b2dcfb70a3a960fd2a19ec9059e314 100644 (file)
@@ -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) {
index 299c2d883b16fd58223db01d8dfaa0dc28399cad..402808c0dc3824ff65fb162aba5026820d5515fa 100755 (executable)
@@ -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