vfs_fruit: let fruit_pwrite_meta_stream also ftruncate empty FinderInfo
authorRalph Boehme <slow@samba.org>
Sat, 20 Oct 2018 21:40:14 +0000 (23:40 +0200)
committerJeremy Allison <jra@samba.org>
Wed, 31 Oct 2018 20:27:22 +0000 (21:27 +0100)
fruit_streaminfo currently filters out the FinderInfo stream is
delete-on-close is set. We set it here internally, but the client may
also set it over SMB. Turns out that the macOS SMB server does NOT
filter out FinderInfo stream with delete-on-close set, so we must change
the way filtering is done in fruit_streaminfo.

Filtering is now done based on the FinderInfo stream being 0-bytes large which
is why I'm adding the ftruncate here.

No idea why the tests that check the filtering passed the commits
leading up to this one, but if you revert this commit after applying the
whole patchset, the "delete AFP_AfpInfo by writing all 0" test will fail.

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

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/modules/vfs_fruit.c

index 05b94fcd8087c58a7adaeb17445776e13d29d619..08747dc3cee7d62e5c6042c8f460f92913d26fbf 100644 (file)
@@ -4554,23 +4554,29 @@ static ssize_t fruit_pwrite_meta_stream(vfs_handle_struct *handle,
                return -1;
        }
 
-       nwritten = SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
-       if (nwritten != n) {
-               return -1;
-       }
-
-       if (!ai_empty_finderinfo(ai)) {
-               return n;
-       }
+       if (ai_empty_finderinfo(ai)) {
+               ret = SMB_VFS_NEXT_FTRUNCATE(handle, fsp, 0);
+               if (ret != 0) {
+                       DBG_ERR("SMB_VFS_NEXT_FTRUNCATE on [%s] failed\n",
+                               fsp_str_dbg(fsp));
+                       return -1;
+               }
 
-       ok = set_delete_on_close(
+               ok = set_delete_on_close(
                        fsp,
                        true,
                        handle->conn->session_info->security_token,
                        handle->conn->session_info->unix_token);
-       if (!ok) {
-               DBG_ERR("set_delete_on_close on [%s] failed\n",
-                       fsp_str_dbg(fsp));
+               if (!ok) {
+                       DBG_ERR("set_delete_on_close on [%s] failed\n",
+                               fsp_str_dbg(fsp));
+                       return -1;
+               }
+               return n;
+       }
+
+       nwritten = SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
+       if (nwritten != n) {
                return -1;
        }