Sebastian Lackner : server: Return STATUS_CANNOT_DELETE when trying to open readonly file with FILE_DELETE_ON_CLOSE.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Nov 11 08:36:43 CST 2015


Module: wine
Branch: master
Commit: 4857f95803bc23a17c2d1d284701a74140d3e005
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4857f95803bc23a17c2d1d284701a74140d3e005

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Wed Nov 11 01:21:41 2015 +0100

server: Return STATUS_CANNOT_DELETE when trying to open readonly file with FILE_DELETE_ON_CLOSE.

Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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)
         {




More information about the wine-cvs mailing list