summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarren Tucker <dtucker@dtucker.net>2023-03-10 13:27:29 +1100
committerDarren Tucker <dtucker@dtucker.net>2023-03-10 13:27:29 +1100
commit77adde4305542ebe3005dd456122624fe2347b01 (patch)
tree2d74b5ad01f606c34a5a9d218d0df8b41ed5c8df
parent633d3dc2a1e9e2a013d019a0576a0771c8423713 (diff)
Wrap mkstemp calls with umask set/restore.
glibc versions 2.06 and earlier did not set a umask on files created by mkstemp created the world-writable. Wrap mkstemp to set and restore the umask. From Coverity (CIDs 291826 291886 291891), ok djm@
-rw-r--r--openbsd-compat/mktemp.c22
-rw-r--r--openbsd-compat/openbsd-compat.h2
2 files changed, 24 insertions, 0 deletions
diff --git a/openbsd-compat/mktemp.c b/openbsd-compat/mktemp.c
index ac922c1e..4b13b983 100644
--- a/openbsd-compat/mktemp.c
+++ b/openbsd-compat/mktemp.c
@@ -34,6 +34,28 @@
#include <ctype.h>
#include <unistd.h>
+#ifdef mkstemp
+#undef mkstemp
+#endif
+
+/*
+ * From glibc man page: 'In glibc versions 2.06 and earlier, the file is
+ * created with permissions 0666, that is, read and write for all users.'
+ * Provide a wrapper to make sure the mask is reasonable (POSIX requires
+ * mode 0600, so mask off any other bits).
+ */
+int
+_ssh_mkstemp(char *template)
+{
+ mode_t mask;
+ int ret;
+
+ mask = umask(0177);
+ ret = mkstemp(template);
+ (void)umask(mask);
+ return ret;
+}
+
#if !defined(HAVE_MKDTEMP)
#define MKTEMP_NAME 0
diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h
index 895ecf9e..cc4cf205 100644
--- a/openbsd-compat/openbsd-compat.h
+++ b/openbsd-compat/openbsd-compat.h
@@ -141,6 +141,8 @@ int mkstemp(char *path);
char *mkdtemp(char *path);
#endif
+#define mkstemp(x) _ssh_mkstemp(x)
+
#ifndef HAVE_DAEMON
int daemon(int nochdir, int noclose);
#endif