Co-authored-by: Bernhard Übelacker bernhardu@mailbox.org
-- v5: server: Open file read-only when writing only attributes. server: Open code FILE_UNIX_WRITE_ACCESS flags.
From: Joel Holdsworth joel@airwebreathe.org.uk
Co-authored-by: Bernhard Übelacker bernhardu@mailbox.org --- dlls/ntdll/tests/file.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index dee5b04d77e..a956c25a367 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -5887,6 +5887,16 @@ static void test_file_readonly_access(void) status = pNtOpenFile(&handle, GENERIC_WRITE, &attr, &io, default_sharing, FILE_NON_DIRECTORY_FILE); ok(status == STATUS_ACCESS_DENIED, "expected STATUS_ACCESS_DENIED, got %#lx.\n", status);
+ /* NtOpenFile FILE_{READ,WRITE}_ATTRIBUTES */ + status = pNtOpenFile(&handle, FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES, &attr, &io, default_sharing, FILE_NON_DIRECTORY_FILE); + todo_wine ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %#lx.\n", status); + CloseHandle(handle); + + /* NtOpenFile FILE_{READ,WRITE}_EA */ + status = pNtOpenFile(&handle, FILE_READ_EA | FILE_WRITE_EA, &attr, &io, default_sharing, FILE_NON_DIRECTORY_FILE); + todo_wine ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %#lx.\n", status); + CloseHandle(handle); + /* NtOpenFile DELETE without FILE_DELETE_ON_CLOSE */ status = pNtOpenFile(&handle, DELETE, &attr, &io, default_sharing, FILE_NON_DIRECTORY_FILE); ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %#lx.\n", status);
From: Joel Holdsworth joel@airwebreathe.org.uk
--- server/fd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/server/fd.c b/server/fd.c index bb0e90d99d0..1816486081d 100644 --- a/server/fd.c +++ b/server/fd.c @@ -1935,7 +1935,8 @@ struct fd *open_fd( struct fd *root, const char *name, struct unicode_str nt_nam flags &= ~(O_CREAT | O_EXCL | O_TRUNC); }
- if ((access & FILE_UNIX_WRITE_ACCESS) && !(options & FILE_DIRECTORY_FILE)) + if ((access & (FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA)) && + !(options & FILE_DIRECTORY_FILE)) { if (access & FILE_UNIX_READ_ACCESS) rw_mode = O_RDWR; else rw_mode = O_WRONLY;
From: Joel Holdsworth joel@airwebreathe.org.uk
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56925 --- dlls/ntdll/tests/file.c | 4 ++-- server/fd.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index a956c25a367..5f751f397a6 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -5889,12 +5889,12 @@ static void test_file_readonly_access(void)
/* NtOpenFile FILE_{READ,WRITE}_ATTRIBUTES */ status = pNtOpenFile(&handle, FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES, &attr, &io, default_sharing, FILE_NON_DIRECTORY_FILE); - todo_wine ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %#lx.\n", status); + ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %#lx.\n", status); CloseHandle(handle);
/* NtOpenFile FILE_{READ,WRITE}_EA */ status = pNtOpenFile(&handle, FILE_READ_EA | FILE_WRITE_EA, &attr, &io, default_sharing, FILE_NON_DIRECTORY_FILE); - todo_wine ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %#lx.\n", status); + ok(status == STATUS_SUCCESS, "expected STATUS_SUCCESS, got %#lx.\n", status); CloseHandle(handle);
/* NtOpenFile DELETE without FILE_DELETE_ON_CLOSE */ diff --git a/server/fd.c b/server/fd.c index 1816486081d..9c70bb2e506 100644 --- a/server/fd.c +++ b/server/fd.c @@ -1935,7 +1935,7 @@ struct fd *open_fd( struct fd *root, const char *name, struct unicode_str nt_nam flags &= ~(O_CREAT | O_EXCL | O_TRUNC); }
- if ((access & (FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA)) && + if ((access & (FILE_WRITE_DATA|FILE_APPEND_DATA)) && !(options & FILE_DIRECTORY_FILE)) { if (access & FILE_UNIX_READ_ACCESS) rw_mode = O_RDWR;
Jinoh Kang (@iamahuman) commented about server/fd.c:
flags &= ~(O_CREAT | O_EXCL | O_TRUNC); }
- if ((access & FILE_UNIX_WRITE_ACCESS) && !(options & FILE_DIRECTORY_FILE))
- if ((access & (FILE_WRITE_DATA|FILE_APPEND_DATA)) &&
I think we should change the definition of `FILE_UNIX_WRITE_ACCESS` instead. It's in server/file.h.