]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
libadouble: allow FILE_SHARE_DELETE in ad_convert_xattr()
authorRalph Boehme <slow@samba.org>
Tue, 23 May 2023 15:28:33 +0000 (17:28 +0200)
committerJule Anger <janger@samba.org>
Wed, 31 May 2023 07:49:14 +0000 (07:49 +0000)
Not specifying FILE_SHARE_DELETE wasn't done intentionally. Not setting the flag
triggers the following problem:

* client sends a CREATE with delete access

* this triggers a call to open_streams_for_delete() where we check for
conflicting opens on any of the streams of the file or directory

* if the file (or directory) has a stream like ":com.apple.quarantine" the
stream is opened with DELETE_ACCESS and kept open when the next step might:

* if the file (or directory) has a Mac specific :AFP_AfpInfo stream, the
ad_convert() routine in fruit_create_file() is triggered

* ad_convert() checks if the file (or ...) has a sidecar ._ AppleDouble file, if
it has:

* in ad_convert_xattr() we unpack any set of xattrs encoded in the AppleDouble
file and recreate them as streams with the VFS. Now, if any of these xattrs
happens to be converted to a stream that we still have open in
open_streams_for_delete() (see above) we get a NT_STATUS_SHARING_VIOLATION

This error gets passed up the stack back to open_streams_for_delete() so the
client CREATE request fails and the client is unhappy.

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

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
(cherry picked from commit 55bd10456486628cad2bd085618e873598401c3b)

selftest/knownfail.d/samba3.vfs.fruit.delete_trigger_convert_sharing_violation [deleted file]
source3/lib/adouble.c

diff --git a/selftest/knownfail.d/samba3.vfs.fruit.delete_trigger_convert_sharing_violation b/selftest/knownfail.d/samba3.vfs.fruit.delete_trigger_convert_sharing_violation
deleted file mode 100644 (file)
index 7af35b0..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-^samba3.vfs.fruit metadata_netatalk.delete_trigger_convert_sharing_violation\(nt4_dc\)
-^samba3.vfs.fruit metadata_stream.delete_trigger_convert_sharing_violation\(nt4_dc\)
-^samba3.vfs.fruit streams_depot.delete_trigger_convert_sharing_violation\(nt4_dc\)
-^samba3.vfs.fruit fruit_delete_empty_adfiles.delete_trigger_convert_sharing_violation\(nt4_dc\)
index 062c73ec75889188582e81bc09e2ef3b5fde6373..15f8f0aa8a9021e4c5040103888207f4c78dd025 100644 (file)
@@ -1222,7 +1222,7 @@ static bool ad_convert_xattr(vfs_handle_struct *handle,
                        NULL,                           /* dirfsp */
                        stream_name,                    /* fname */
                        FILE_GENERIC_WRITE,             /* access_mask */
-                       FILE_SHARE_READ | FILE_SHARE_WRITE, /* share_access */
+                       FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, /* share_access */
                        FILE_OPEN_IF,                   /* create_disposition */
                        0,                              /* create_options */
                        0,                              /* file_attributes */