[PATCH] vfs_streams_xattr: use fsp, not base_fsp
Jeremy Allison
jra at samba.org
Tue Feb 21 19:34:49 UTC 2017
On Sat, Feb 18, 2017 at 06:25:22PM +0100, Ralph Böhme wrote:
> Hi!
>
> Here's a patch to vfs_streams_xattr that lets it use the prpoer fsp in a few
> places.
>
> Passed a private autobuild ontop of master as well as on top of my fruity
> branch.
>
> Please review & push if happy. Thanks!
LGTM - pushed. Thanks !
Jeremy.
> From 9b9565a8722089521c475a980a0da282791db14c Mon Sep 17 00:00:00 2001
> From: Ralph Boehme <slow at samba.org>
> Date: Fri, 17 Feb 2017 08:10:53 +0100
> Subject: [PATCH] vfs_streams_xattr: use fsp, not base_fsp
>
> The base_fsp's fd is always -1 as it's closed after being openend in
> create_file_unixpath().
>
> Additionally in streams_xattr_open force using of SMB_VFS_FSETXATTR() by
> sticking the just created fd into the fsp (and removing it afterwards).
>
> Bug: https://bugzilla.samba.org/show_bug.cgi?id=12591
>
> Signed-off-by: Ralph Boehme <slow at samba.org>
> ---
> source3/modules/vfs_streams_xattr.c | 41 +++++++++++++++----------------------
> 1 file changed, 17 insertions(+), 24 deletions(-)
>
> diff --git a/source3/modules/vfs_streams_xattr.c b/source3/modules/vfs_streams_xattr.c
> index 5a484fa..6692636 100644
> --- a/source3/modules/vfs_streams_xattr.c
> +++ b/source3/modules/vfs_streams_xattr.c
> @@ -264,7 +264,7 @@ static int streams_xattr_fstat(vfs_handle_struct *handle, files_struct *fsp,
> return -1;
> }
>
> - sbuf->st_ex_size = get_xattr_size(handle->conn, fsp->base_fsp,
> + sbuf->st_ex_size = get_xattr_size(handle->conn, fsp,
> io->base, io->xattr_name);
> if (sbuf->st_ex_size == -1) {
> return -1;
> @@ -399,6 +399,7 @@ static int streams_xattr_open(vfs_handle_struct *handle,
> char *xattr_name = NULL;
> int baseflags;
> int hostfd = -1;
> + int ret;
>
> DEBUG(10, ("streams_xattr_open called for %s with flags 0x%x\n",
> smb_fname_str_dbg(smb_fname), flags));
> @@ -410,7 +411,6 @@ static int streams_xattr_open(vfs_handle_struct *handle,
> /* If the default stream is requested, just open the base file. */
> if (is_ntfs_default_stream_smb_fname(smb_fname)) {
> char *tmp_stream_name;
> - int ret;
>
> tmp_stream_name = smb_fname->stream_name;
> smb_fname->stream_name = NULL;
> @@ -500,20 +500,13 @@ static int streams_xattr_open(vfs_handle_struct *handle,
> DEBUG(10, ("creating or truncating attribute %s on file %s\n",
> xattr_name, smb_fname->base_name));
>
> - if (fsp->base_fsp->fh->fd != -1) {
> - if (SMB_VFS_FSETXATTR(
> - fsp->base_fsp, xattr_name,
> + fsp->fh->fd = hostfd;
> + ret = SMB_VFS_FSETXATTR(fsp, xattr_name,
> &null, sizeof(null),
> - flags & O_EXCL ? XATTR_CREATE : 0) == -1) {
> - goto fail;
> - }
> - } else {
> - if (SMB_VFS_SETXATTR(
> - handle->conn, smb_fname->base_name,
> - xattr_name, &null, sizeof(null),
> - flags & O_EXCL ? XATTR_CREATE : 0) == -1) {
> - goto fail;
> - }
> + flags & O_EXCL ? XATTR_CREATE : 0);
> + fsp->fh->fd = -1;
> + if (ret != 0) {
> + goto fail;
> }
> }
>
> @@ -968,7 +961,7 @@ static ssize_t streams_xattr_pwrite(vfs_handle_struct *handle,
> return -1;
> }
>
> - status = get_ea_value(talloc_tos(), handle->conn, fsp->base_fsp,
> + status = get_ea_value(talloc_tos(), handle->conn, fsp,
> sio->base, sio->xattr_name, &ea);
> if (!NT_STATUS_IS_OK(status)) {
> return -1;
> @@ -992,13 +985,13 @@ static ssize_t streams_xattr_pwrite(vfs_handle_struct *handle,
>
> memcpy(ea.value.data + offset, data, n);
>
> - if (fsp->base_fsp->fh->fd != -1) {
> - ret = SMB_VFS_FSETXATTR(fsp->base_fsp,
> + if (fsp->fh->fd != -1) {
> + ret = SMB_VFS_FSETXATTR(fsp,
> sio->xattr_name,
> ea.value.data, ea.value.length, 0);
> } else {
> ret = SMB_VFS_SETXATTR(fsp->conn,
> - fsp->base_fsp->fsp_name->base_name,
> + fsp->fsp_name->base_name,
> sio->xattr_name,
> ea.value.data, ea.value.length, 0);
> }
> @@ -1032,7 +1025,7 @@ static ssize_t streams_xattr_pread(vfs_handle_struct *handle,
> return -1;
> }
>
> - status = get_ea_value(talloc_tos(), handle->conn, fsp->base_fsp,
> + status = get_ea_value(talloc_tos(), handle->conn, fsp,
> sio->base, sio->xattr_name, &ea);
> if (!NT_STATUS_IS_OK(status)) {
> return -1;
> @@ -1077,7 +1070,7 @@ static int streams_xattr_ftruncate(struct vfs_handle_struct *handle,
> return -1;
> }
>
> - status = get_ea_value(talloc_tos(), handle->conn, fsp->base_fsp,
> + status = get_ea_value(talloc_tos(), handle->conn, fsp,
> sio->base, sio->xattr_name, &ea);
> if (!NT_STATUS_IS_OK(status)) {
> return -1;
> @@ -1102,13 +1095,13 @@ static int streams_xattr_ftruncate(struct vfs_handle_struct *handle,
> ea.value.length = offset + 1;
> ea.value.data[offset] = 0;
>
> - if (fsp->base_fsp->fh->fd != -1) {
> - ret = SMB_VFS_FSETXATTR(fsp->base_fsp,
> + if (fsp->fh->fd != -1) {
> + ret = SMB_VFS_FSETXATTR(fsp,
> sio->xattr_name,
> ea.value.data, ea.value.length, 0);
> } else {
> ret = SMB_VFS_SETXATTR(fsp->conn,
> - fsp->base_fsp->fsp_name->base_name,
> + fsp->fsp_name->base_name,
> sio->xattr_name,
> ea.value.data, ea.value.length, 0);
> }
> --
> 2.9.3
>
More information about the samba-technical
mailing list