diff --git a/programs/fileio.c b/programs/fileio.c index 7d58a11e..e289f9ab 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -502,14 +502,21 @@ void FIO_setContentSize(FIO_prefs_t* const prefs, int value) * @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); + stat_t statbuf; + if (!UTIL_stat(path, &statbuf)) { + DISPLAYLEVEL(2, "zstd: Failed to stat %s while trying to remove it\n", path); + return 0; + } + if (!UTIL_isRegularFileStat(&statbuf)) { + 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 */ - UTIL_chmod(path, NULL, _S_IWRITE); + if (!(statbuf.mode & _S_IWRITE)) { + UTIL_chmod(path, &statbuf, _S_IWRITE); + } #endif return remove(path); } diff --git a/programs/util.c b/programs/util.c index fd4d7a60..9f9f45d2 100644 --- a/programs/util.c +++ b/programs/util.c @@ -157,7 +157,8 @@ int UTIL_setFileStat(const char *filename, const stat_t *statbuf) { int res = 0; - if (!UTIL_isRegularFile(filename)) + stat_t curStatBuf; + if (!UTIL_stat(filename, &curStatBuf) || !UTIL_isRegularFileStat(&curStatBuf)) return -1; /* set access and modification times */ @@ -185,7 +186,7 @@ int UTIL_setFileStat(const char *filename, const stat_t *statbuf) res += chown(filename, statbuf->st_uid, statbuf->st_gid); /* Copy ownership */ #endif - res += UTIL_chmod(filename, NULL, statbuf->st_mode & 07777); /* Copy file permissions */ + res += UTIL_chmod(filename, &curStatBuf, statbuf->st_mode & 07777); /* Copy file permissions */ errno = 0; return -res; /* number of errors is returned */