Module: wine Branch: master Commit: ce9d4b807e6608c284778f9b524a4071035959d5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ce9d4b807e6608c284778f9b52...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Jul 24 12:20:29 2013 +0200
msvcrt: Fix _mktemp implementation.
---
dlls/msvcrt/file.c | 16 ++++++++++------ dlls/msvcrt/tests/file.c | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 1f17a93..a07e940 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -1691,9 +1691,12 @@ char * CDECL MSVCRT__mktemp(char *pattern) int id; char letter = 'a';
+ if(!pattern) + return NULL; + while(*pattern) numX = (*pattern++ == 'X')? numX + 1 : 0; - if (numX < 5) + if (numX < 6) return NULL; pattern--; id = GetCurrentProcessId(); @@ -1708,8 +1711,7 @@ char * CDECL MSVCRT__mktemp(char *pattern) do { *pattern = letter++; - if (GetFileAttributesA(retVal) == INVALID_FILE_ATTRIBUTES && - GetLastError() == ERROR_FILE_NOT_FOUND) + if (GetFileAttributesA(retVal) == INVALID_FILE_ATTRIBUTES) return retVal; } while(letter <= 'z'); return NULL; @@ -1725,9 +1727,12 @@ MSVCRT_wchar_t * CDECL MSVCRT__wmktemp(MSVCRT_wchar_t *pattern) int id; MSVCRT_wchar_t letter = 'a';
+ if(!pattern) + return NULL; + while(*pattern) numX = (*pattern++ == 'X')? numX + 1 : 0; - if (numX < 5) + if (numX < 6) return NULL; pattern--; id = GetCurrentProcessId(); @@ -1741,8 +1746,7 @@ MSVCRT_wchar_t * CDECL MSVCRT__wmktemp(MSVCRT_wchar_t *pattern) pattern++; do { - if (GetFileAttributesW(retVal) == INVALID_FILE_ATTRIBUTES && - GetLastError() == ERROR_FILE_NOT_FOUND) + if (GetFileAttributesW(retVal) == INVALID_FILE_ATTRIBUTES) return retVal; *pattern = letter++; } while(letter != '|'); diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c index 5731437..fc92272 100644 --- a/dlls/msvcrt/tests/file.c +++ b/dlls/msvcrt/tests/file.c @@ -2130,6 +2130,26 @@ static void test_stdin(void) ok(h != NULL, "h == NULL\n"); }
+static void test_mktemp(void) +{ + char buf[16]; + + strcpy(buf, "a"); + ok(!_mktemp(buf), "_mktemp("a") != NULL\n"); + + strcpy(buf, "testXXXXX"); + ok(!_mktemp(buf), "_mktemp("testXXXXX") != NULL\n"); + + strcpy(buf, "testXXXXXX"); + ok(_mktemp(buf) != NULL, "_mktemp("testXXXXXX") == NULL\n"); + + strcpy(buf, "testXXXXXXa"); + ok(!_mktemp(buf), "_mktemp("testXXXXXXa") != NULL\n"); + + strcpy(buf, "**XXXXXX"); + ok(_mktemp(buf) != NULL, "_mktemp("**XXXXXX") == NULL\n"); +} + START_TEST(file) { int arg_c; @@ -2193,6 +2213,7 @@ START_TEST(file) test_setmaxstdio(); test_pipes(arg_v[0]); test_stdin(); + test_mktemp();
/* Wait for the (_P_NOWAIT) spawned processes to finish to make sure the report * file contains lines in the correct order