1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-02 09:47:23 +03:00

s3: VFS: streams_xattr: In streams_xattr_stat() use synthetic_pathref() with basename

Remove my poor imitation of synthetic_pathref(), just call the real thing.

We need to go through the full VFS stack here to get
the ino correct to get the fsp handle.

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

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
This commit is contained in:
Jeremy Allison 2021-07-13 11:41:05 -07:00 committed by Ralph Boehme
parent 03e36502f4
commit 40cf129abb

View File

@ -222,7 +222,7 @@ static int streams_xattr_stat(vfs_handle_struct *handle,
int result = -1;
char *xattr_name = NULL;
char *tmp_stream_name = NULL;
struct smb_filename *smb_fname_cp = NULL;
struct smb_filename *pathref = NULL;
struct files_struct *fsp = smb_fname->fsp;
if (!is_named_stream(smb_fname)) {
@ -254,49 +254,30 @@ static int streams_xattr_stat(vfs_handle_struct *handle,
/* Augment the base file's stat information before returning. */
if (fsp == NULL) {
/*
* openat_pathref_fsp() checks for the same
* filetype as the incoming stat info before allowing
* the open, so we must ensure it's correct here.
*/
smb_fname->st.st_ex_mode &= ~S_IFMT;
smb_fname->st.st_ex_mode |= S_IFREG;
/*
* openat_pathref_fsp() expects a talloc'ed
* smb_filename. stat can be passed a struct
* from the stack. Make a talloc'ed copy
* so openat_pathref_fsp() can add its
* destructor.
*/
smb_fname_cp = cp_smb_filename(talloc_tos(),
smb_fname);
if (smb_fname_cp == NULL) {
TALLOC_FREE(xattr_name);
errno = ENOMEM;
return -1;
}
status = openat_pathref_fsp(handle->conn->cwd_fsp,
smb_fname_cp);
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)) {
DBG_DEBUG("openat_pathref_fsp for %s failed with %s\n",
smb_fname_str_dbg(smb_fname),
nt_errstr(status));
TALLOC_FREE(xattr_name);
TALLOC_FREE(smb_fname_cp);
SET_STAT_INVALID(smb_fname->st);
errno = ENOENT;
return -1;
}
fsp = smb_fname_cp->fsp;
fsp = pathref->fsp;
} else {
fsp = fsp->base_fsp;
}
SMB_ASSERT(fsp->base_fsp != NULL);
smb_fname->st.st_ex_size = get_xattr_size_fsp(fsp->base_fsp,
smb_fname->st.st_ex_size = get_xattr_size_fsp(fsp,
xattr_name);
if (smb_fname->st.st_ex_size == -1) {
TALLOC_FREE(xattr_name);
TALLOC_FREE(smb_fname_cp);
TALLOC_FREE(pathref);
SET_STAT_INVALID(smb_fname->st);
errno = ENOENT;
return -1;
@ -309,7 +290,7 @@ static int streams_xattr_stat(vfs_handle_struct *handle,
smb_fname->st.st_ex_size / STAT_ST_BLOCKSIZE + 1;
TALLOC_FREE(xattr_name);
TALLOC_FREE(smb_fname_cp);
TALLOC_FREE(pathref);
return 0;
}