From 6cf35f84045f38f067365623886fecff16ca92f9 Mon Sep 17 00:00:00 2001
From: Romain Naour <romain.naour@openwide.fr>
Date: Sat, 1 Aug 2015 18:31:06 +0200
Subject: add mkstemps, mkstemps64 and mkostemps, mkostemps64 functions

Change __gen_tempname() prototype in order to pass the additional
suffix lenght. In __gen_tempname() add a new check for suffixlen.
Update some comments in the code.

Signed-off-by: Romain Naour <romain.naour@openwide.fr>
Signed-off-by: Waldemar Brodkorb <wbx@uclibc-ng.org>
---
 libc/misc/internals/tempname.c | 16 +++++++++-------
 libc/misc/internals/tempname.h |  3 ++-
 2 files changed, 11 insertions(+), 8 deletions(-)

(limited to 'libc/misc')

diff --git a/libc/misc/internals/tempname.c b/libc/misc/internals/tempname.c
index edcc31c1a..7654eb433 100644
--- a/libc/misc/internals/tempname.c
+++ b/libc/misc/internals/tempname.c
@@ -163,10 +163,10 @@ static void brain_damaged_fillrand(unsigned char *buf, unsigned int len)
 	}
 }
 
-/* Generate a temporary file name based on TMPL.  TMPL must match the
-   rules for mk[s]temp (i.e. end in "XXXXXX").  The name constructed
-   does not exist at the time of the call to __gen_tempname.  TMPL is
-   overwritten with the result.
+/* Generate a temporary file name based on TMPL. TMPL must match the
+   rules for mk[s]temp[s] (i.e. end in "prefixXXXXXXsuffix"). The name
+   constructed does not exist at the time of the call to __gen_tempname.
+   TMPL is overwritten with the result.
 
    KIND may be one of:
    __GT_NOCREATE:       simply verify that the name does not exist
@@ -177,7 +177,8 @@ static void brain_damaged_fillrand(unsigned char *buf, unsigned int len)
    __GT_DIR:            create a directory with given mode.
 
 */
-int attribute_hidden __gen_tempname (char *tmpl, int kind, int flags, mode_t mode)
+int attribute_hidden __gen_tempname (char *tmpl, int kind, int flags,
+                                     int suffixlen, mode_t mode)
 {
     char *XXXXXX;
     unsigned int i;
@@ -187,8 +188,9 @@ int attribute_hidden __gen_tempname (char *tmpl, int kind, int flags, mode_t mod
 
     len = strlen (tmpl);
     /* This is where the Xs start.  */
-    XXXXXX = tmpl + len - 6;
-    if (len < 6 || strcmp (XXXXXX, "XXXXXX"))
+    XXXXXX = tmpl + len - 6 - suffixlen;
+    if (len < 6 || suffixlen < 0 || suffixlen > len - 6
+        || strncmp (XXXXXX, "XXXXXX", 6))
     {
 	__set_errno (EINVAL);
 	return -1;
diff --git a/libc/misc/internals/tempname.h b/libc/misc/internals/tempname.h
index edfe26d8c..cc20f756c 100644
--- a/libc/misc/internals/tempname.h
+++ b/libc/misc/internals/tempname.h
@@ -10,7 +10,8 @@ extern int ___path_search (char *tmpl, size_t tmpl_len, const char *dir,
 	        const char *pfx /*, int try_tmpdir */) attribute_hidden;
 #define __path_search(tmpl, tmpl_len, dir, pfx, try_tmpdir) ___path_search(tmpl, tmpl_len, dir, pfx)
 
-extern int __gen_tempname (char *__tmpl, int __kind, int flags, mode_t mode) attribute_hidden;
+extern int __gen_tempname (char *__tmpl, int __kind, int flags,
+                           int suffixlen, mode_t mode) attribute_hidden;
 
 /* The __kind argument to __gen_tempname may be one of: */
 #define __GT_FILE     0       /* create a file */
-- 
cgit v1.2.3