From: Volker Lendecke Date: Fri, 3 Jan 2025 11:33:43 +0000 (+0100) Subject: vfs_fruit: Don't expect a pathref fsp in unlinkat X-Git-Tag: tdb-1.4.13~100 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1e490886d8ec99d6d15918f80fbf56f462214342;p=thirdparty%2Fsamba.git vfs_fruit: Don't expect a pathref fsp in unlinkat The unix syscall unlinkat does not expect a file descriptor for the to-be-removed object. SMB_VFS_UNLINKAT should also not expect that. Put the special case into vfs_fruit. This is required to simplify delete_all_streams next, which should not have to do an openat_pathref_fsp() on all streams just for the vfs_fruit case. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c index cf179adb182..2afa1ab18e2 100644 --- a/source3/modules/vfs_fruit.c +++ b/source3/modules/vfs_fruit.c @@ -1953,12 +1953,41 @@ static int fruit_unlink_meta_stream(vfs_handle_struct *handle, } static int fruit_unlink_meta_netatalk(vfs_handle_struct *handle, + struct files_struct *dirfsp, const struct smb_filename *smb_fname) { - SMB_ASSERT(smb_fname->fsp != NULL); - SMB_ASSERT(fsp_is_alternate_stream(smb_fname->fsp)); - return SMB_VFS_FREMOVEXATTR(smb_fname->fsp->base_fsp, - AFPINFO_EA_NETATALK); + struct smb_filename *base_name = NULL; + struct files_struct *base_fsp = NULL; + int ret = -1; + + if (smb_fname->fsp == NULL) { + NTSTATUS status; + + base_name = cp_smb_filename_nostream(talloc_tos(), smb_fname); + if (base_name == NULL) { + errno = ENOMEM; + goto done; + } + + status = openat_pathref_fsp(dirfsp, base_name); + if (!NT_STATUS_IS_OK(status)) { + errno = map_errno_from_nt_status(status); + goto done; + } + base_fsp = base_name->fsp; + } else { + SMB_ASSERT(fsp_is_alternate_stream(smb_fname->fsp)); + base_fsp = smb_fname->fsp->base_fsp; + } + + ret = SMB_VFS_FREMOVEXATTR(base_fsp, AFPINFO_EA_NETATALK); +done: + { + int err = errno; + TALLOC_FREE(base_name); + errno = err; + } + return ret; } static int fruit_unlink_meta(vfs_handle_struct *handle, @@ -1979,7 +2008,7 @@ static int fruit_unlink_meta(vfs_handle_struct *handle, break; case FRUIT_META_NETATALK: - rc = fruit_unlink_meta_netatalk(handle, smb_fname); + rc = fruit_unlink_meta_netatalk(handle, dirfsp, smb_fname); break; default: