Skip to content

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.

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

Edited by Ralph Böhme

Merge request reports