]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
fixed detection of input==output on Visual 1479/head
authorYann Collet <cyan@fb.com>
Wed, 26 Dec 2018 23:51:34 +0000 (15:51 -0800)
committerYann Collet <cyan@fb.com>
Wed, 26 Dec 2018 23:51:34 +0000 (15:51 -0800)
due to bad support of inode identifiers.
On Visual, option is limited to same file name,
which is imperfect, but way better than disabling the feature entirely.

It's enough to pass associated tests.

programs/fileio.c

index a5460ba2d838d7145d64a72066426c13691cc9f7..9fb795ed3f27bbfbb9b45e6f1087112449060c56 100644 (file)
@@ -423,16 +423,29 @@ static FILE* FIO_openDstFile(const char* srcFileName, const char* dstFileName)
         return stdout;
     }
 
+    /* ensure dst is not the same file as src */
     if (srcFileName != NULL) {
+#ifdef _MSC_VER
+        /* note : Visual does not support file identification by inode.
+         *        The following work-around is limited to detecting exact name repetition only,
+         *        aka `filename` is considered different from `subdir/../filename` */
+        if (!strcmp(srcFileName, dstFileName)) {
+            DISPLAYLEVEL(1, "zstd: Refusing to open a output file which will overwrite the input file \n");
+            return NULL;
+        }
+#else
         stat_t srcStat;
         stat_t dstStat;
-        if ( UTIL_getFileStat(srcFileName, &srcStat)
-          && UTIL_getFileStat(dstFileName, &dstStat) ) {
-            if ( srcStat.st_dev == dstStat.st_dev
-              && srcStat.st_ino == dstStat.st_ino ) {
+        if (UTIL_getFileStat(srcFileName, &srcStat)
+            && UTIL_getFileStat(dstFileName, &dstStat)) {
+            if (srcStat.st_dev == dstStat.st_dev
+                && srcStat.st_ino == dstStat.st_ino) {
                 DISPLAYLEVEL(1, "zstd: Refusing to open a output file which will overwrite the input file \n");
                 return NULL;
-    }   }   }
+            }
+        }
+#endif
+    }
 
     if (g_sparseFileSupport == 1) {
         g_sparseFileSupport = ZSTD_SPARSE_DEFAULT;