[PATCH v9 0/4] MR8030: wineserver: Allow NtOpenFile with read-only files.
Co-authored-by: Bernhard Übelacker <bernhardu@mailbox.org> -- v9: server: Don't require Unix read permission for reading only attributes. https://gitlab.winehq.org/wine/wine/-/merge_requests/8030
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 6268870bc08..817a9cd818a 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -5951,6 +5951,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); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8030
From: 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 817a9cd818a..5788761228a 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -5951,6 +5951,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_ATTRIBUTES with FILE_WRITE_DATA */ + status = pNtOpenFile(&handle, FILE_READ_ATTRIBUTES | FILE_WRITE_DATA, &attr, &io, default_sharing, FILE_NON_DIRECTORY_FILE); + ok(status == STATUS_ACCESS_DENIED, "expected STATUS_ACCESS_DENIED, got %#lx.\n", status); + CloseHandle(handle); + + /* NtOpenFile FILE_READ_ATTRIBUTES with FILE_APPEND_DATA */ + status = pNtOpenFile(&handle, FILE_READ_ATTRIBUTES | FILE_APPEND_DATA, &attr, &io, default_sharing, FILE_NON_DIRECTORY_FILE); + ok(status == STATUS_ACCESS_DENIED, "expected STATUS_ACCESS_DENIED, got %#lx.\n", status); + CloseHandle(handle); + /* 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); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8030
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/file.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index 5788761228a..f479b03c120 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -5963,12 +5963,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/file.h b/server/file.h index e1485e4d5fc..b77cffbb442 100644 --- a/server/file.h +++ b/server/file.h @@ -297,7 +297,7 @@ static inline int async_queued( struct async_queue *queue ) #define FILE_UNIX_READ_ACCESS (FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA) /* access rights that require Unix write permission */ -#define FILE_UNIX_WRITE_ACCESS (FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA) +#define FILE_UNIX_WRITE_ACCESS (FILE_WRITE_DATA|FILE_APPEND_DATA) /* magic file access rights for mappings */ #define FILE_MAPPING_IMAGE 0x80000000 /* set for SEC_IMAGE mappings */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8030
From: Joel Holdsworth <joel@airwebreathe.org.uk> --- server/file.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/file.h b/server/file.h index b77cffbb442..12e9158a0a4 100644 --- a/server/file.h +++ b/server/file.h @@ -294,7 +294,7 @@ static inline int async_queued( struct async_queue *queue ) /* access rights that require Unix read permission */ -#define FILE_UNIX_READ_ACCESS (FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA) +#define FILE_UNIX_READ_ACCESS (FILE_READ_DATA) /* access rights that require Unix write permission */ #define FILE_UNIX_WRITE_ACCESS (FILE_WRITE_DATA|FILE_APPEND_DATA) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/8030
On Tue May 12 16:45:34 2026 +0000, Alexandre Julliard wrote:
Both FILE_UNIX_READ_ACCESS and FILE_UNIX_WRITE_ACCESS access are now open-coded in server. They were virtually unused and only obscured the behaviour of the code. As Jinoh predicted, the usage of write access flags is now inconsistent. I'm not sure this was an improvement. I removed the open-coding the of `FILE_UNIX_READ_ACCESS`/`FILE_UNIX_WRITE_ACCESS`, and instead removed attributes flags symmetrically from both.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/8030#note_139599
participants (3)
-
Bernhard Übelacker -
Joel Holdsworth -
Joel Holdsworth (@jhol)