From 638a23483b40c5b606ee323e6612e7e454e5154b Mon Sep 17 00:00:00 2001 From: "Anthony G. Basile" Date: Mon, 27 Oct 2014 16:13:34 -0400 Subject: mkostemp: fix implementation mkostemp(char *template, int flags) generates a unique temporary filename from a template. The flags parameter accepts three of the same flags as open(2): O_APPEND, O_CLOEXEC, and O_SYNC. The current implementation of mkostemp(3) does not respect the flags and in fact confuses the flags with the file mode which should always be S_IRUSR | S_IWUSR. This patch corrects this issue. Signed-off-by: Anthony G. Basile Signed-off-by: Bernhard Reutner-Fischer --- libc/stdlib/mkdtemp.c | 2 +- libc/stdlib/mkostemp.c | 4 +++- libc/stdlib/mkostemp64.c | 2 +- libc/stdlib/mkstemp.c | 2 +- libc/stdlib/mkstemp64.c | 2 +- libc/stdlib/mktemp.c | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) (limited to 'libc/stdlib') diff --git a/libc/stdlib/mkdtemp.c b/libc/stdlib/mkdtemp.c index da7598a6f..e6d4a364c 100644 --- a/libc/stdlib/mkdtemp.c +++ b/libc/stdlib/mkdtemp.c @@ -29,7 +29,7 @@ (This function comes from OpenBSD.) */ char * mkdtemp (char *template) { - if (__gen_tempname (template, __GT_DIR, S_IRUSR | S_IWUSR | S_IXUSR)) + if (__gen_tempname (template, __GT_DIR, 0, S_IRUSR | S_IWUSR | S_IXUSR)) return NULL; else return template; diff --git a/libc/stdlib/mkostemp.c b/libc/stdlib/mkostemp.c index 0369235dc..912be30a6 100644 --- a/libc/stdlib/mkostemp.c +++ b/libc/stdlib/mkostemp.c @@ -17,6 +17,7 @@ #include #include +#include #include "../misc/internals/tempname.h" /* Generate a unique temporary file name from TEMPLATE. @@ -26,5 +27,6 @@ int mkostemp (char *template, int flags) { - return __gen_tempname (template, __GT_FILE, flags); + flags -= flags & O_ACCMODE; /* Remove O_RDONLY, O_WRONLY, and O_RDWR. */ + return __gen_tempname (template, __GT_FILE, flags, S_IRUSR | S_IWUSR); } diff --git a/libc/stdlib/mkostemp64.c b/libc/stdlib/mkostemp64.c index d21def58a..c6d6d849d 100644 --- a/libc/stdlib/mkostemp64.c +++ b/libc/stdlib/mkostemp64.c @@ -27,5 +27,5 @@ int mkostemp64 (char *template, int flags) { - return __gen_tempname (template, __GT_BIGFILE, flags | O_LARGEFILE); + return __gen_tempname (template, __GT_BIGFILE, flags | O_LARGEFILE, S_IRUSR | S_IWUSR | S_IXUSR); } diff --git a/libc/stdlib/mkstemp.c b/libc/stdlib/mkstemp.c index 61c717511..a3a159590 100644 --- a/libc/stdlib/mkstemp.c +++ b/libc/stdlib/mkstemp.c @@ -26,5 +26,5 @@ Then open the file and return a fd. */ int mkstemp (char *template) { - return __gen_tempname (template, __GT_FILE, S_IRUSR | S_IWUSR); + return __gen_tempname (template, __GT_FILE, 0, S_IRUSR | S_IWUSR); } diff --git a/libc/stdlib/mkstemp64.c b/libc/stdlib/mkstemp64.c index e29be2da4..6f2ee3e83 100644 --- a/libc/stdlib/mkstemp64.c +++ b/libc/stdlib/mkstemp64.c @@ -26,5 +26,5 @@ Then open the file and return a fd. */ int mkstemp64 (char *template) { - return __gen_tempname (template, __GT_BIGFILE, S_IRUSR | S_IWUSR); + return __gen_tempname (template, __GT_BIGFILE, 0, S_IRUSR | S_IWUSR); } diff --git a/libc/stdlib/mktemp.c b/libc/stdlib/mktemp.c index edd001d49..1ff93da3c 100644 --- a/libc/stdlib/mktemp.c +++ b/libc/stdlib/mktemp.c @@ -24,7 +24,7 @@ * they are replaced with a string that makes the filename unique. */ char *mktemp(char *template) { - if (__gen_tempname (template, __GT_NOCREATE, 0) < 0) + if (__gen_tempname (template, __GT_NOCREATE, 0, 0) < 0) /* We return the null string if we can't find a unique file name. */ template[0] = '\0'; -- cgit v1.2.3