smbd: Fix DELETE_ON_CLOSE behaviour on files with READ_ONLY attribute
authorChristof Schmitt <cs@samba.org>
Fri, 2 Nov 2018 19:08:23 +0000 (12:08 -0700)
committerChristof Schmitt <cs@samba.org>
Sat, 3 Nov 2018 02:01:25 +0000 (03:01 +0100)
MS-FSA states that a CREATE with FILE_DELETE_ON_CLOSE on an existing
file with READ_ONLY attribute has to return STATUS_CANNOT_DELETE. This
was missing in smbd as the check used the DOS attributes from the CREATE
instead of the DOS attributes on the existing file.

We need to handle the new file and existing file cases separately.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13673

Signed-off-by: Christof Schmitt <cs@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
selftest/knownfail
source3/smbd/open.c

index ed1383cace8ce677d63845a42e7f8debcb8af702..16c2274daec21b20b8998c479e234b21f9c98154 100644 (file)
 ^samba.tests.ntlmdisabled.python\(ad_dc_no_ntlm\).ntlmdisabled.NtlmDisabledTests.test_ntlm_connection\(ad_dc_no_ntlm\)
 ^samba.tests.ntlmdisabled.python\(ktest\).python3.ntlmdisabled.NtlmDisabledTests.test_samr_change_password\(ktest\)
 ^samba.tests.ntlmdisabled.python\(ad_dc_no_ntlm\).python3.ntlmdisabled.NtlmDisabledTests.test_ntlm_connection\(ad_dc_no_ntlm\)
-^samba3.smb2.delete-on-close-perms.READONLY\(nt4_dc\)
-^samba3.smb2.delete-on-close-perms.READONLY\(ad_dc\)
index d6359aac0c6922fe1c4c3c71e4bff9a2cd7091fb..a323a42609e36666c64e19070c8968edfb3eb41c 100644 (file)
@@ -3280,6 +3280,18 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
                request_time = fsp->open_time;
        }
 
+       if ((create_options & FILE_DELETE_ON_CLOSE) &&
+                       (flags2 & O_CREAT) &&
+                       !file_existed) {
+               /* Delete on close semantics for new files. */
+               status = can_set_delete_on_close(fsp,
+                                               new_dos_attributes);
+               if (!NT_STATUS_IS_OK(status)) {
+                       fd_close(fsp);
+                       return status;
+               }
+       }
+
        /*
         * Ensure we pay attention to default ACLs on directories if required.
         */
@@ -3732,15 +3744,17 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 
        /* Handle strange delete on close create semantics. */
        if (create_options & FILE_DELETE_ON_CLOSE) {
+               if (!new_file_created) {
+                       status = can_set_delete_on_close(fsp,
+                                        existing_dos_attributes);
 
-               status = can_set_delete_on_close(fsp, new_dos_attributes);
-
-               if (!NT_STATUS_IS_OK(status)) {
-                       /* Remember to delete the mode we just added. */
-                       del_share_mode(lck, fsp);
-                       TALLOC_FREE(lck);
-                       fd_close(fsp);
-                       return status;
+                       if (!NT_STATUS_IS_OK(status)) {
+                               /* Remember to delete the mode we just added. */
+                               del_share_mode(lck, fsp);
+                               TALLOC_FREE(lck);
+                               fd_close(fsp);
+                               return status;
+                       }
                }
                /* Note that here we set the *inital* delete on close flag,
                   not the regular one. The magic gets handled in close. */