[PATCH v16 0/3] MR8030: wineserver: Allow NtOpenFile with read-only files.
Co-authored-by: Bernhard Übelacker <bernhardu@mailbox.org> -- v16: server: Don't require Unix read or write permission for reading or writing 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 049efb95518..4bed4766959 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -5953,6 +5953,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 4bed4766959..4dadeedf71f 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -5953,6 +5953,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/fd.c | 10 +++++----- server/file.h | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index 4dadeedf71f..4f525043fd5 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -5965,12 +5965,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 efb6e8e76b9..279822e2da4 100644 --- a/server/fd.c +++ b/server/fd.c @@ -1979,7 +1979,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_UNIX_WRITE_ACCESS) && !(options & FILE_DIRECTORY_FILE)) + if (((access & FILE_UNIX_WRITE_ACCESS) && !(options & FILE_DIRECTORY_FILE)) || (flags & O_TRUNC)) { if (access & FILE_UNIX_READ_ACCESS) rw_mode = O_RDWR; else rw_mode = O_WRONLY; @@ -1988,11 +1988,11 @@ struct fd *open_fd( struct fd *root, const char *name, struct unicode_str nt_nam if ((fd->unix_fd = open( name, rw_mode | (flags & ~O_TRUNC), *mode )) == -1) { - /* if we tried to open a directory for write access, retry read-only */ - if (errno == EISDIR) + if ((errno == EISDIR && ((access & FILE_UNIX_WRITE_ACCESS) || (flags & (O_CREAT | O_TRUNC)))) || + ((errno == EISDIR || errno == EACCES) && (flags & O_TRUNC) && + !(access & (FILE_UNIX_WRITE_ACCESS | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA)))) { - if ((access & FILE_UNIX_WRITE_ACCESS) || (flags & O_CREAT)) - fd->unix_fd = open( name, O_RDONLY | (flags & ~(O_TRUNC | O_CREAT | O_EXCL)), *mode ); + fd->unix_fd = open( name, O_RDONLY | (flags & ~(O_TRUNC | O_CREAT | O_EXCL)), *mode ); } if (fd->unix_fd == -1) diff --git a/server/file.h b/server/file.h index e1485e4d5fc..12e9158a0a4 100644 --- a/server/file.h +++ b/server/file.h @@ -294,10 +294,10 @@ 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|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
participants (3)
-
Bernhard Übelacker -
Joel Holdsworth -
Joel Holdsworth (@jhol)