From c1449143c5502367ca1277f01d28416880d37e9b Mon Sep 17 00:00:00 2001 From: "W. Felix Handte" Date: Wed, 5 Aug 2020 12:10:42 -0400 Subject: [PATCH] Share stat() Calls in Uses of UTIL_chmod() --- programs/fileio.c | 13 ++++++++++--- programs/util.c | 5 +++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/programs/fileio.c b/programs/fileio.c index 7d58a11e7..e289f9abf 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 fd4d7a604..9f9f45d2b 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 */