Piotr Caban : msvcrt: Fix _mktemp implementation.
Module: wine Branch: master Commit: ce9d4b807e6608c284778f9b524a4071035959d5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ce9d4b807e6608c284778f9b52... Author: Piotr Caban <piotr(a)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
participants (1)
-
Alexandre Julliard