From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/file.c | 13 +++++++++++-- dlls/ucrtbase/tests/file.c | 22 +++++++++++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 7a2efdc5b92..7dae517cbe2 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -2172,6 +2172,7 @@ int CDECL _mktemp_s(char *pattern, size_t size) */ char * CDECL _mktemp(char *pattern) { + wchar_t *pathW, *p; int numX = 0; char *retVal = pattern; int id; @@ -2194,12 +2195,20 @@ char * CDECL _mktemp(char *pattern) id = tempNum; } pattern++; + if (!(pathW = wstrdupa_utf8(retVal))) + return NULL; + p = pathW + wcslen(pathW) - 6; do { - *pattern = letter++; - if (GetFileAttributesA(retVal) == INVALID_FILE_ATTRIBUTES) + *p = letter++; + if (GetFileAttributesW(pathW) == INVALID_FILE_ATTRIBUTES) + { + *pattern = *p; + free(pathW); return retVal; + } } while(letter <= 'z'); + free(pathW); return NULL; }
diff --git a/dlls/ucrtbase/tests/file.c b/dlls/ucrtbase/tests/file.c index 8664fc9f3b2..f37b80566a4 100644 --- a/dlls/ucrtbase/tests/file.c +++ b/dlls/ucrtbase/tests/file.c @@ -238,7 +238,7 @@ static void test_utf8(void) const WCHAR fileW[] = L"file\x0119\x015b\x0107"; const WCHAR dirW[] = L"dir\x0119\x015b\x0107";
- char buf[256], *p; + char file2[32], buf[256], *p; FILE *f; int ret;
@@ -290,6 +290,26 @@ static void test_utf8(void) ret = _chmod(file, _S_IREAD | _S_IWRITE); ok(!ret, "_chmod returned %d, error %d\n", ret, errno);
+ strcpy(file2, file); + strcat(file2, "XXXXXX"); + p = _mktemp(file2); + ok(p == file2, "_mktemp returned %p, file2 %p, errno %d\n", p, file2, errno); + ok(!memcmp(file2, file, sizeof(file) - 1), "file2 = %s\n", debugstr_a(file2)); + ok(p[ARRAY_SIZE(file) - 1] == 'a', "p = %s\n", debugstr_a(p)); + f = fopen(p, "w"); + ok(!!f, "fopen returned %d, error %d\n", ret, errno); + fclose(f); + + strcpy(buf, file); + strcat(buf, "XXXXXX"); + p = _mktemp(buf); + ok(p == buf, "_mktemp returned %p, buf %p, errno %d\n", p, buf, errno); + ok(!memcmp(buf, file, sizeof(file) - 1), "buf = %s\n", debugstr_a(buf)); + ok(p[ARRAY_SIZE(file) - 1] == 'b', "p = %s\n", debugstr_a(p)); + + ret = remove(file2); + ok(!ret, "remove returned %d, errno %d\n", ret, errno); + ret = _wunlink(fileW); todo_wine_if(GetACP() != CP_UTF8) ok(!ret, "_wunlink returned %d, errno %d\n", ret, errno); if (ret)