This commit addresses #2491.
Note that a downside of this solution is that it is global: `umask()` affects
all file creation calls in the process. I believe this is safe since
`fileio.c` functions should only ever be used in the zstd binary, and these
are (almost) the only files ever created by zstd, and AIUI they're only
created in a single thread. So we can get away with messing with global state.
Note that this doesn't change the permissions of files created by `dibio.c`.
I'm not sure what those should be...
FIO_removeFile(dstFileName);
} }
- { FILE* const f = fopen( dstFileName, "wb" );
+ { const int old_umask = UTIL_umask(0177); /* u-x,go-rwx */
+ FILE* const f = fopen( dstFileName, "wb" );
+ UTIL_umask(old_umask);
if (f == NULL) {
DISPLAYLEVEL(1, "zstd: %s: %s\n", dstFileName, strerror(errno));
- } else if (srcFileName != NULL
- && strcmp (srcFileName, stdinmark)
- && strcmp(dstFileName, nulmark) ) {
- /* reduce rights on newly created dst file while compression is ongoing */
- UTIL_chmod(dstFileName, NULL, 00600);
}
return f;
}
return chmod(filename, permissions);
}
+int UTIL_umask(int mode) {
+#if PLATFORM_POSIX_VERSION > 0
+ return umask(mode);
+#else
+ /* do nothing, fake return value */
+ return mode;
+#endif
+}
+
int UTIL_setFileStat(const char *filename, const stat_t *statbuf)
{
int res = 0;
#include "platform.h" /* PLATFORM_POSIX_VERSION, ZSTD_NANOSLEEP_SUPPORT, ZSTD_SETPRIORITY_SUPPORT */
#include <stddef.h> /* size_t, ptrdiff_t */
#include <sys/types.h> /* stat, utime */
-#include <sys/stat.h> /* stat, chmod */
+#include <sys/stat.h> /* stat, chmod, umask */
#include "../lib/common/mem.h" /* U64 */
*/
int UTIL_chmod(char const* filename, const stat_t* statbuf, mode_t permissions);
+/**
+ * Wraps umask(). Does nothing when the platform doesn't have that concept.
+ */
+int UTIL_umask(int mode);
+
/*
* In the absence of a pre-existing stat result on the file in question, these
* functions will do a stat() call internally and then use that result to