From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/file.c | 12 +++--------- dlls/ucrtbase/tests/file.c | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 422e7712660..044e1c99dee 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -4351,19 +4351,13 @@ FILE * CDECL _wfsopen(const wchar_t *path, const wchar_t *mode, int share) */ FILE * CDECL _fsopen(const char *path, const char *mode, int share) { - FILE *ret; wchar_t *pathW = NULL, *modeW = NULL; + FILE *ret;
- if (path && !(pathW = msvcrt_wstrdupa(path))) { - _invalid_parameter(NULL, NULL, NULL, 0, 0); - *_errno() = EINVAL; - return NULL; - } - if (mode && !(modeW = msvcrt_wstrdupa(mode))) + if (path && !(pathW = wstrdupa_utf8(path))) return NULL; + if (mode && !(modeW = wstrdupa_utf8(mode))) { free(pathW); - _invalid_parameter(NULL, NULL, NULL, 0, 0); - *_errno() = EINVAL; return NULL; }
diff --git a/dlls/ucrtbase/tests/file.c b/dlls/ucrtbase/tests/file.c index da0103265be..8b696880eea 100644 --- a/dlls/ucrtbase/tests/file.c +++ b/dlls/ucrtbase/tests/file.c @@ -232,10 +232,13 @@ static BOOL is_lossless_convertion(const char *str)
static void test_utf8(void) { + const char file[] = "file\xc4\x99\xc5\x9b\xc4\x87"; const char dir[] = "dir\xc4\x99\xc5\x9b\xc4\x87"; + const WCHAR fileW[] = L"file\x0119\x015b\x0107"; const WCHAR dirW[] = L"dir\x0119\x015b\x0107";
char buf[256], *p; + FILE *f; int ret;
if (!setlocale(LC_ALL, ".utf8")) @@ -276,6 +279,18 @@ static void test_utf8(void) todo_wine_if(!is_lossless_convertion(dir)) ok(!strcmp(p + 1, dir), "unexpected working directory: %s\n", debugstr_a(buf));
+ f = fopen(file, "w"); + ok(!!f, "fopen returned %d, error %d\n", ret, errno); + fclose(f); + + ret = _wunlink(fileW); + todo_wine_if(GetACP() != CP_UTF8) ok(!ret, "_wunlink returned %d, errno %d\n", ret, errno); + if (ret) + { + ret = _unlink(file); + ok(!ret, "_unlink returned %d, errno %d\n", ret, errno); + } + ret = _chdir(".."); ok(!ret, "_chdir returned %d, error %d\n", ret, errno);
From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/file.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 044e1c99dee..72898fc01e0 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -1101,12 +1101,13 @@ int CDECL _wchmod(const wchar_t *path, int flags) */ int CDECL _unlink(const char *path) { - TRACE("%s\n", debugstr_a(path)); - if(DeleteFileA(path)) - return 0; - TRACE("failed (%ld)\n", GetLastError()); - msvcrt_set_errno(GetLastError()); - return -1; + wchar_t *pathW = NULL; + int ret; + + if (path && !(pathW = wstrdupa_utf8(path))) return -1; + ret = _wunlink(pathW); + free(pathW); + return ret; }
/*********************************************************************
From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/file.c | 20 ++++++-------------- dlls/ucrtbase/tests/file.c | 3 +++ 2 files changed, 9 insertions(+), 14 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 72898fc01e0..adb849e1781 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -993,21 +993,13 @@ FILE * CDECL __acrt_iob_func(unsigned idx) */ int CDECL _access(const char *filename, int mode) { - DWORD attr = GetFileAttributesA(filename); - - TRACE("(%s,%d) %ld\n", filename, mode, attr); + wchar_t *filenameW = NULL; + int ret;
- if (!filename || attr == INVALID_FILE_ATTRIBUTES) - { - msvcrt_set_errno(GetLastError()); - return -1; - } - if ((attr & FILE_ATTRIBUTE_READONLY) && (mode & MSVCRT_W_OK)) - { - msvcrt_set_errno(ERROR_ACCESS_DENIED); - return -1; - } - return 0; + if (filename && !(filenameW = wstrdupa_utf8(filename))) return -1; + ret = _waccess(filenameW, mode); + free(filenameW); + return ret; }
/********************************************************************* diff --git a/dlls/ucrtbase/tests/file.c b/dlls/ucrtbase/tests/file.c index 8b696880eea..201ac7fe07f 100644 --- a/dlls/ucrtbase/tests/file.c +++ b/dlls/ucrtbase/tests/file.c @@ -283,6 +283,9 @@ static void test_utf8(void) ok(!!f, "fopen returned %d, error %d\n", ret, errno); fclose(f);
+ ret = access(file, 0); + ok(!ret, "access returned %d, error %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)
From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/file.c | 17 ++++++----------- dlls/ucrtbase/tests/file.c | 4 ++++ 2 files changed, 10 insertions(+), 11 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index adb849e1781..2d61704fc3f 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -1055,18 +1055,13 @@ int CDECL _waccess_s(const wchar_t *filename, int mode) */ int CDECL _chmod(const char *path, int flags) { - DWORD oldFlags = GetFileAttributesA(path); - - if (oldFlags != INVALID_FILE_ATTRIBUTES) - { - DWORD newFlags = (flags & _S_IWRITE)? oldFlags & ~FILE_ATTRIBUTE_READONLY: - oldFlags | FILE_ATTRIBUTE_READONLY; + wchar_t *pathW = NULL; + int ret;
- if (newFlags == oldFlags || SetFileAttributesA(path, newFlags)) - return 0; - } - msvcrt_set_errno(GetLastError()); - return -1; + if (path && !(pathW = wstrdupa_utf8(path))) return -1; + ret = _wchmod(pathW, flags); + free(pathW); + return ret; }
/********************************************************************* diff --git a/dlls/ucrtbase/tests/file.c b/dlls/ucrtbase/tests/file.c index 201ac7fe07f..8664fc9f3b2 100644 --- a/dlls/ucrtbase/tests/file.c +++ b/dlls/ucrtbase/tests/file.c @@ -23,6 +23,7 @@ #include <stdarg.h> #include <locale.h> #include <share.h> +#include <sys/stat.h>
#include <windef.h> #include <winbase.h> @@ -286,6 +287,9 @@ static void test_utf8(void) ret = access(file, 0); ok(!ret, "access returned %d, error %d\n", ret, errno);
+ ret = _chmod(file, _S_IREAD | _S_IWRITE); + ok(!ret, "_chmod returned %d, error %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)
From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/file.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 2d61704fc3f..d2ab0142f4c 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -5008,12 +5008,7 @@ int CDECL _putws(const wchar_t *s) */ int CDECL remove(const char *path) { - TRACE("(%s)\n", path); - if (DeleteFileA(path)) - return 0; - TRACE(":failed (%ld)\n", GetLastError()); - msvcrt_set_errno(GetLastError()); - return -1; + return _unlink(path); }
/*********************************************************************
From: Piotr Caban piotr@codeweavers.com
--- dlls/msvcrt/file.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index d2ab0142f4c..7a2efdc5b92 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -5016,12 +5016,7 @@ int CDECL remove(const char *path) */ int CDECL _wremove(const wchar_t *path) { - TRACE("(%s)\n", debugstr_w(path)); - if (DeleteFileW(path)) - return 0; - TRACE(":failed (%ld)\n", GetLastError()); - msvcrt_set_errno(GetLastError()); - return -1; + return _wunlink(path); }
/*********************************************************************
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)
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);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=150172
Your paranoid android.
=== debian11 (32 bit ja:JP report) ===
ucrtbase: file.c:308: Test failed: p = "file\xc4\x99\xc5\x9b\xc4\x87a00300" file.c:314: Test failed: buf = "file\xc4\x99\xc5\x9b\xc4\x87a00300"