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)