]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3: VFS: streams_xattr: Add the same accommodation to streams_xattr_unlinkat() as...
authorJeremy Allison <jra@samba.org>
Sat, 18 Jun 2022 00:51:35 +0000 (17:51 -0700)
committerNoel Power <npower@samba.org>
Mon, 20 Jun 2022 14:24:20 +0000 (14:24 +0000)
vfs_fruit passes a synthetic filename here where smb_fname->fsp==NULL
when configured to use "fruit:resource = stream" so we need to use
synthetic_pathref() to get an fsp on the smb_fname->base_name
in order to call SMB_VFS_FREMOVEXATTR().

This is the same change we already use in streams_xattr_renameat()
and streams_xattr_stat(), the other pathname operations we implement
here.

Remove knownfail.

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

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Noel Power <npower@samba.org>
Autobuild-User(master): Noel Power <npower@samba.org>
Autobuild-Date(master): Mon Jun 20 14:24:20 UTC 2022 on sn-devel-184

selftest/knownfail.d/fruit_resource_stream [deleted file]
source3/modules/vfs_streams_xattr.c

diff --git a/selftest/knownfail.d/fruit_resource_stream b/selftest/knownfail.d/fruit_resource_stream
deleted file mode 100644 (file)
index 081edb9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-^samba3.blackbox.fruit.resource_stream.resource_stream\(fileserver\)
index 324490354b0de6048fa0598609eeba28869e4cbf..3e39770bb378091f4752b2b3e4e562224a650693 100644 (file)
@@ -479,6 +479,8 @@ static int streams_xattr_unlinkat(vfs_handle_struct *handle,
        NTSTATUS status;
        int ret = -1;
        char *xattr_name = NULL;
+       struct smb_filename *pathref = NULL;
+       struct files_struct *fsp = smb_fname->fsp;
 
        if (!is_named_stream(smb_fname)) {
                return SMB_VFS_NEXT_UNLINKAT(handle,
@@ -497,10 +499,26 @@ static int streams_xattr_unlinkat(vfs_handle_struct *handle,
                goto fail;
        }
 
-       SMB_ASSERT(smb_fname->fsp != NULL);
-       SMB_ASSERT(fsp_is_alternate_stream(smb_fname->fsp));
+       if (fsp == NULL) {
+               status = synthetic_pathref(talloc_tos(),
+                                       handle->conn->cwd_fsp,
+                                       smb_fname->base_name,
+                                       NULL,
+                                       NULL,
+                                       smb_fname->twrp,
+                                       smb_fname->flags,
+                                       &pathref);
+               if (!NT_STATUS_IS_OK(status)) {
+                       errno = ENOENT;
+                       goto fail;
+               }
+               fsp = pathref->fsp;
+       } else {
+               SMB_ASSERT(fsp_is_alternate_stream(smb_fname->fsp));
+               fsp = fsp->base_fsp;
+       }
 
-       ret = SMB_VFS_FREMOVEXATTR(smb_fname->fsp->base_fsp, xattr_name);
+       ret = SMB_VFS_FREMOVEXATTR(fsp, xattr_name);
 
        if ((ret == -1) && (errno == ENOATTR)) {
                errno = ENOENT;
@@ -511,6 +529,7 @@ static int streams_xattr_unlinkat(vfs_handle_struct *handle,
 
  fail:
        TALLOC_FREE(xattr_name);
+       TALLOC_FREE(pathref);
        return ret;
 }