diff --git a/source3/modules/vfs_streams_xattr.c b/source3/modules/vfs_streams_xattr.c index 324490354b0..3e39770bb37 100644 --- a/source3/modules/vfs_streams_xattr.c +++ b/source3/modules/vfs_streams_xattr.c @@ -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; }