Piotr Caban : msvcrt: Add tmpnam_s implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Feb 3 07:40:00 CST 2016


Module: wine
Branch: stable
Commit: 61b762b9a90029f1163b69420ebc8480db79e222
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=61b762b9a90029f1163b69420ebc8480db79e222

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Dec 22 17:43:20 2015 +0100

msvcrt: Add tmpnam_s implementation.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 9b6c93f6f2b151f5b619e0365257135860d3d048)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 .../api-ms-win-crt-stdio-l1-1-0.spec               |  2 +-
 dlls/msvcr100/msvcr100.spec                        |  2 +-
 dlls/msvcr110/msvcr110.spec                        |  2 +-
 dlls/msvcr120/msvcr120.spec                        |  2 +-
 dlls/msvcr120_app/msvcr120_app.spec                |  2 +-
 dlls/msvcr80/msvcr80.spec                          |  2 +-
 dlls/msvcr90/msvcr90.spec                          |  2 +-
 dlls/msvcrt/file.c                                 | 72 +++++++++++++++++-----
 dlls/msvcrt/msvcrt.h                               |  1 +
 dlls/msvcrt/msvcrt.spec                            |  2 +-
 dlls/ucrtbase/ucrtbase.spec                        |  2 +-
 11 files changed, 66 insertions(+), 25 deletions(-)

diff --git a/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec b/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec
index 30570da..5e0c3c9 100644
--- a/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-stdio-l1-1-0/api-ms-win-crt-stdio-l1-1-0.spec
@@ -154,6 +154,6 @@
 @ cdecl tmpfile() ucrtbase.tmpfile
 @ cdecl tmpfile_s(ptr) ucrtbase.tmpfile_s
 @ cdecl tmpnam(ptr) ucrtbase.tmpnam
-@ stub tmpnam_s
+@ cdecl tmpnam_s(ptr long) ucrtbase.tmpnam_s
 @ cdecl ungetc(long ptr) ucrtbase.ungetc
 @ cdecl ungetwc(long ptr) ucrtbase.ungetwc
diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 8ceecc9..d773fd8 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -1833,7 +1833,7 @@
 @ cdecl tmpfile() MSVCRT_tmpfile
 @ cdecl tmpfile_s(ptr) MSVCRT_tmpfile_s
 @ cdecl tmpnam(ptr) MSVCRT_tmpnam
-@ stub tmpnam_s
+@ cdecl tmpnam_s(ptr long) MSVCRT_tmpnam_s
 @ cdecl tolower(long) MSVCRT_tolower
 @ cdecl toupper(long) MSVCRT_toupper
 @ cdecl towlower(long) MSVCRT_towlower
diff --git a/dlls/msvcr110/msvcr110.spec b/dlls/msvcr110/msvcr110.spec
index e42ec11..f236a1e 100644
--- a/dlls/msvcr110/msvcr110.spec
+++ b/dlls/msvcr110/msvcr110.spec
@@ -2192,7 +2192,7 @@
 @ cdecl tmpfile() MSVCRT_tmpfile
 @ cdecl tmpfile_s(ptr) MSVCRT_tmpfile_s
 @ cdecl tmpnam(ptr) MSVCRT_tmpnam
-@ stub tmpnam_s
+@ cdecl tmpnam_s(ptr long) MSVCRT_tmpnam_s
 @ cdecl tolower(long) MSVCRT_tolower
 @ cdecl toupper(long) MSVCRT_toupper
 @ cdecl towlower(long) MSVCRT_towlower
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec
index 9f04cbf..e7b53e9 100644
--- a/dlls/msvcr120/msvcr120.spec
+++ b/dlls/msvcr120/msvcr120.spec
@@ -2411,7 +2411,7 @@
 @ cdecl tmpfile() MSVCRT_tmpfile
 @ cdecl tmpfile_s(ptr) MSVCRT_tmpfile_s
 @ cdecl tmpnam(ptr) MSVCRT_tmpnam
-@ stub tmpnam_s
+@ cdecl tmpnam_s(ptr long) MSVCRT_tmpnam_s
 @ cdecl tolower(long) MSVCRT_tolower
 @ cdecl toupper(long) MSVCRT_toupper
 @ stub towctrans
diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec
index d3591c1..757b2dc 100644
--- a/dlls/msvcr120_app/msvcr120_app.spec
+++ b/dlls/msvcr120_app/msvcr120_app.spec
@@ -2073,7 +2073,7 @@
 @ cdecl tmpfile() msvcr120.tmpfile
 @ cdecl tmpfile_s(ptr) msvcr120.tmpfile_s
 @ cdecl tmpnam(ptr) msvcr120.tmpnam
-@ stub tmpnam_s
+@ cdecl tmpnam_s(ptr long) msvcr120.tmpnam_s
 @ cdecl tolower(long) msvcr120.tolower
 @ cdecl toupper(long) msvcr120.toupper
 @ stub towctrans
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index e83e056..31bafe0 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -1514,7 +1514,7 @@
 @ cdecl tmpfile() MSVCRT_tmpfile
 @ cdecl tmpfile_s(ptr) MSVCRT_tmpfile_s
 @ cdecl tmpnam(ptr) MSVCRT_tmpnam
-@ stub tmpnam_s
+@ cdecl tmpnam_s(ptr long) MSVCRT_tmpnam_s
 @ cdecl tolower(long) MSVCRT_tolower
 @ cdecl toupper(long) MSVCRT_toupper
 @ cdecl towlower(long) MSVCRT_towlower
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 9aef185..05dd4e3 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -1486,7 +1486,7 @@
 @ cdecl tmpfile() MSVCRT_tmpfile
 @ cdecl tmpfile_s(ptr) MSVCRT_tmpfile_s
 @ cdecl tmpnam(ptr) MSVCRT_tmpnam
-@ stub tmpnam_s
+@ cdecl tmpnam_s(ptr long) MSVCRT_tmpnam_s
 @ cdecl tolower(long) MSVCRT_tolower
 @ cdecl toupper(long) MSVCRT_toupper
 @ cdecl towlower(long) MSVCRT_towlower
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 22bb925..a708c67 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -128,6 +128,7 @@ static int MSVCRT_umask = 0;
 
 /* INTERNAL: static data for tmpnam and _wtmpname functions */
 static int tmpnam_unique;
+static int tmpnam_s_unique;
 
 static const unsigned int EXE = 'e' << 16 | 'x' << 8 | 'e';
 static const unsigned int BAT = 'b' << 16 | 'a' << 8 | 't';
@@ -4780,15 +4781,65 @@ void CDECL MSVCRT_setbuf(MSVCRT_FILE* file, char *buf)
   MSVCRT_setvbuf(file, buf, buf ? MSVCRT__IOFBF : MSVCRT__IONBF, MSVCRT_BUFSIZ);
 }
 
+static int tmpnam_helper(char *s, MSVCRT_size_t size, int *tmpnam_unique, int tmp_max)
+{
+    char tmpstr[8];
+    char *p = s;
+    int digits;
+
+    if (!MSVCRT_CHECK_PMT(s != NULL)) return MSVCRT_EINVAL;
+
+    if (size < 3) {
+        if (size) *s = 0;
+        *MSVCRT__errno() = MSVCRT_ERANGE;
+        return MSVCRT_ERANGE;
+    }
+    *p++ = '\\';
+    *p++ = 's';
+    size -= 2;
+    digits = msvcrt_int_to_base32(GetCurrentProcessId(), tmpstr);
+    if (digits+1 > size) {
+        *s = 0;
+        *MSVCRT__errno() = MSVCRT_ERANGE;
+        return MSVCRT_ERANGE;
+    }
+    memcpy(p, tmpstr, digits*sizeof(tmpstr[0]));
+    p += digits;
+    *p++ = '.';
+    size -= digits+1;
+
+    while(1) {
+        while ((digits = *tmpnam_unique)+1 < tmp_max) {
+            if (InterlockedCompareExchange(tmpnam_unique, digits+1, digits) == digits)
+                break;
+        }
+
+        digits = msvcrt_int_to_base32(digits, tmpstr);
+        if (digits+1 > size) {
+            *s = 0;
+            *MSVCRT__errno() = MSVCRT_ERANGE;
+            return MSVCRT_ERANGE;
+        }
+        memcpy(p, tmpstr, digits*sizeof(tmpstr[0]));
+        p[digits] = 0;
+
+        if (GetFileAttributesA(s) == INVALID_FILE_ATTRIBUTES &&
+                GetLastError() == ERROR_FILE_NOT_FOUND)
+            break;
+    }
+    return 0;
+}
+
+int CDECL MSVCRT_tmpnam_s(char *s, MSVCRT_size_t size)
+{
+    return tmpnam_helper(s, size, &tmpnam_s_unique, MSVCRT_TMP_MAX_S);
+}
+
 /*********************************************************************
  *		tmpnam (MSVCRT.@)
  */
 char * CDECL MSVCRT_tmpnam(char *s)
 {
-  char tmpstr[16];
-  char *p;
-  int count, size;
-
   if (!s) {
     thread_data_t *data = msvcrt_get_thread_data();
 
@@ -4798,18 +4849,7 @@ char * CDECL MSVCRT_tmpnam(char *s)
     s = data->tmpnam_buffer;
   }
 
-  msvcrt_int_to_base32(GetCurrentProcessId(), tmpstr);
-  p = s + sprintf(s, "\\s%s.", tmpstr);
-  for (count = 0; count < MSVCRT_TMP_MAX; count++)
-  {
-    size = msvcrt_int_to_base32(tmpnam_unique++, tmpstr);
-    memcpy(p, tmpstr, size);
-    p[size] = '\0';
-    if (GetFileAttributesA(s) == INVALID_FILE_ATTRIBUTES &&
-        GetLastError() == ERROR_FILE_NOT_FOUND)
-      break;
-  }
-  return s;
+  return tmpnam_helper(s, -1, &tmpnam_unique, MSVCRT_TMP_MAX) ? NULL : s;
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index 77f612e..e30e675 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -663,6 +663,7 @@ struct MSVCRT__stat64 {
 #define MSVCRT_WEOF (MSVCRT_wint_t)(0xFFFF)
 #define MSVCRT_EOF       (-1)
 #define MSVCRT_TMP_MAX   0x7fff
+#define MSVCRT_TMP_MAX_S 0x7fffffff
 #define MSVCRT_RAND_MAX  0x7fff
 #define MSVCRT_BUFSIZ    512
 
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index c1f41da..24d7c57 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -1457,7 +1457,7 @@
 @ cdecl tmpfile() MSVCRT_tmpfile
 @ cdecl tmpfile_s(ptr) MSVCRT_tmpfile_s
 @ cdecl tmpnam(ptr) MSVCRT_tmpnam
-# stub tmpnam_s(ptr long)
+@ cdecl tmpnam_s(ptr long) MSVCRT_tmpnam_s
 @ cdecl tolower(long) MSVCRT_tolower
 @ cdecl toupper(long) MSVCRT_toupper
 @ cdecl towlower(long) MSVCRT_towlower
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index c3f76d1..7b23329 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -2539,7 +2539,7 @@
 @ cdecl tmpfile() MSVCRT_tmpfile
 @ cdecl tmpfile_s(ptr) MSVCRT_tmpfile_s
 @ cdecl tmpnam(ptr) MSVCRT_tmpnam
-@ stub tmpnam_s
+@ cdecl tmpnam_s(ptr long) MSVCRT_tmpnam_s
 @ cdecl tolower(long) MSVCRT_tolower
 @ cdecl toupper(long) MSVCRT_toupper
 @ stub towctrans




More information about the wine-cvs mailing list