1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-08 21:18:16 +03:00

s3: VFS: streams_xattr: Add the same accommodation to streams_xattr_unlinkat() as used in streams_xattr_renameat().

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
This commit is contained in:
Jeremy Allison 2022-06-17 17:51:35 -07:00 committed by Noel Power
parent 238b2cbb8f
commit 808a7b8b76
2 changed files with 22 additions and 4 deletions

View File

@ -1 +0,0 @@
^samba3.blackbox.fruit.resource_stream.resource_stream\(fileserver\)

View 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;
}