[2/3] server: Return STATUS_CANNOT_DELETE when trying to open readonly file with FILE_DELETE_ON_CLOSE.
Sebastian Lackner
sebastian at fds-team.de
Tue Nov 10 18:21:41 CST 2015
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---
A similar version of this patch has been tested in the Staging tree for a while,
without any regression reports. In theory we should check if the file was created,
instead of O_CREAT. However, the only way to do that on POSIX is with an additional
stat() syscall, which introduces race-conditions. I'm not aware of any application
which depends on that, so this patch should be safe to add. In kernel32/file we
have tests to document the unimplemented parts.
dlls/kernel32/tests/file.c | 4 ----
server/fd.c | 9 +++++++++
2 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index 643054f..91abb03 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -361,16 +361,12 @@ static void test__lcreat( void )
status = NtCreateFile( &file, DELETE, &attr, &io, NULL, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
FILE_OPEN, FILE_DELETE_ON_CLOSE | FILE_NON_DIRECTORY_FILE, NULL, 0 );
- todo_wine
ok( status == STATUS_CANNOT_DELETE, "expected STATUS_CANNOT_DELETE, got %08x\n", status );
- if (!status) CloseHandle( file );
status = NtCreateFile( &file, DELETE, &attr, &io, NULL, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
FILE_OPEN, FILE_DELETE_ON_CLOSE | FILE_DIRECTORY_FILE, NULL, 0 );
- todo_wine
ok( status == STATUS_NOT_A_DIRECTORY, "expected STATUS_NOT_A_DIRECTORY, got %08x\n", status );
- if (!status) CloseHandle( file );
status = NtCreateFile( &file, DELETE, &attr, &io, NULL, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
diff --git a/server/fd.c b/server/fd.c
index fe778f1..e3fe292 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -1850,6 +1850,15 @@ struct fd *open_fd( struct fd *root, const char *name, int flags, mode_t *mode,
set_error( err );
goto error;
}
+
+ /* can't unlink files if we don't have permission to access */
+ if ((options & FILE_DELETE_ON_CLOSE) && !(flags & O_CREAT) &&
+ !(st.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)))
+ {
+ set_error( STATUS_CANNOT_DELETE );
+ goto error;
+ }
+
fd->closed->unlink = (options & FILE_DELETE_ON_CLOSE) != 0;
if (flags & O_TRUNC)
{
--
2.6.2
More information about the wine-patches
mailing list