From: W. Felix Handte Date: Wed, 5 Aug 2020 16:10:42 +0000 (-0400) Subject: Share stat() Calls in Uses of UTIL_chmod() X-Git-Tag: v1.4.7~102^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c1449143c5502367ca1277f01d28416880d37e9b;p=thirdparty%2Fzstd.git Share stat() Calls in Uses of UTIL_chmod() --- 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 */