From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/file.c | 13 ++++++++++--- dlls/ucrtbase/tests/file.c | 6 ++++++ 2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 7dae517cbe2..737548afd31 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -2133,7 +2133,8 @@ intptr_t CDECL _get_osfhandle(int fd) */ int CDECL _mktemp_s(char *pattern, size_t size) { - DWORD len, xno, id; + DWORD len, wlen, xno, id; + wchar_t *pathW;
if(!MSVCRT_CHECK_PMT(pattern!=NULL)) return EINVAL; @@ -2157,10 +2158,16 @@ int CDECL _mktemp_s(char *pattern, size_t size) id /= 10; }
- for(pattern[len-6]='a'; pattern[len-6]<='z'; pattern[len-6]++) { - if(GetFileAttributesA(pattern) == INVALID_FILE_ATTRIBUTES) + if(!(pathW = wstrdupa_utf8(pattern))) return *_errno(); + wlen = wcslen(pathW); + for(pathW[wlen-6]='a'; pathW[wlen-6]<='z'; pathW[wlen-6]++) { + if(GetFileAttributesW(pathW) == INVALID_FILE_ATTRIBUTES) { + pattern[len-6] = pathW[wlen-6]; + free(pathW); return 0; + } } + free(pathW);
pattern[0] = 0; *_errno() = EEXIST; diff --git a/dlls/ucrtbase/tests/file.c b/dlls/ucrtbase/tests/file.c index f37b80566a4..9c9cce9ae97 100644 --- a/dlls/ucrtbase/tests/file.c +++ b/dlls/ucrtbase/tests/file.c @@ -307,6 +307,12 @@ static void test_utf8(void) 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));
+ strcpy(buf, file); + strcat(buf, "XXXXXX"); + ret = _mktemp_s(buf, sizeof(buf)); + ok(!memcmp(buf, file, sizeof(file) - 1), "buf = %s\n", debugstr_a(buf)); + ok(buf[ARRAY_SIZE(file) - 1] == 'b', "buf = %s\n", debugstr_a(buf)); + ret = remove(file2); ok(!ret, "remove returned %d, errno %d\n", ret, errno);