Share stat() Calls in Uses of UTIL_chmod()

dev
W. Felix Handte 2020-08-05 12:10:42 -04:00
parent 0a8aacb4db
commit c1449143c5
2 changed files with 13 additions and 5 deletions

View File

@ -502,14 +502,21 @@ void FIO_setContentSize(FIO_prefs_t* const prefs, int value)
* @result : Unlink `fileName`, even if it's read-only */ * @result : Unlink `fileName`, even if it's read-only */
static int FIO_remove(const char* path) static int FIO_remove(const char* path)
{ {
if (!UTIL_isRegularFile(path)) { stat_t statbuf;
DISPLAYLEVEL(2, "zstd: Refusing to remove non-regular file %s \n", path); 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; return 0;
} }
#if defined(_WIN32) || defined(WIN32) #if defined(_WIN32) || defined(WIN32)
/* windows doesn't allow remove read-only files, /* windows doesn't allow remove read-only files,
* so try to make it writable first */ * 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 #endif
return remove(path); return remove(path);
} }

View File

@ -157,7 +157,8 @@ int UTIL_setFileStat(const char *filename, const stat_t *statbuf)
{ {
int res = 0; int res = 0;
if (!UTIL_isRegularFile(filename)) stat_t curStatBuf;
if (!UTIL_stat(filename, &curStatBuf) || !UTIL_isRegularFileStat(&curStatBuf))
return -1; return -1;
/* set access and modification times */ /* 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 */ res += chown(filename, statbuf->st_uid, statbuf->st_gid); /* Copy ownership */
#endif #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; errno = 0;
return -res; /* number of errors is returned */ return -res; /* number of errors is returned */