diff options
author | Darren Tucker <dtucker@dtucker.net> | 2023-03-10 03:27:29 +0100 |
---|---|---|
committer | Darren Tucker <dtucker@dtucker.net> | 2023-03-10 03:27:29 +0100 |
commit | 77adde4305542ebe3005dd456122624fe2347b01 (patch) | |
tree | 2d74b5ad01f606c34a5a9d218d0df8b41ed5c8df /openbsd-compat | |
parent | upstream: modify parentheses in conditionals to make it clearer what is (diff) | |
download | openssh-77adde4305542ebe3005dd456122624fe2347b01.tar.xz openssh-77adde4305542ebe3005dd456122624fe2347b01.zip |
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@
Diffstat (limited to 'openbsd-compat')
-rw-r--r-- | openbsd-compat/mktemp.c | 22 | ||||
-rw-r--r-- | openbsd-compat/openbsd-compat.h | 2 |
2 files changed, 24 insertions, 0 deletions
diff --git a/openbsd-compat/mktemp.c b/openbsd-compat/mktemp.c index ac922c1ec..4b13b9834 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 895ecf9ea..cc4cf2055 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 |