From 6b7a1d6127a0306731d4f98a0da2b9e91c078242 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 26 Dec 2018 15:51:34 -0800 Subject: [PATCH] fixed detection of input==output on Visual 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 | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/programs/fileio.c b/programs/fileio.c index a5460ba2d..9fb795ed3 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -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; -- 2.47.2