Fix for vfs_fruit to avoid SHARING_VIOLATION when a deletion triggers AppleDouble conversion
ad_convert_xattr() doesn't pass FILE_SHARE_DELETE to SMB_VFS_CREATE_FILE() and this might trigger a subtle NT_STATUS_SHARING_VIOLATION error.
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.