From: Jeremy Allison Date: Tue, 23 May 2017 20:12:29 +0000 (-0700) Subject: s3: VFS: Change SMB_VFS_LISTXATTR to use const struct smb_filename * instead of const... X-Git-Tag: ldb-1.1.31~178 X-Git-Url: http://git.samba.org/?a=commitdiff_plain;h=892476b555f57bcbe40883c533e208c81be168c9;p=samba.git s3: VFS: Change SMB_VFS_LISTXATTR to use const struct smb_filename * instead of const char *. We need to migrate all pathname based VFS calls to use a struct to finish modernising the VFS with extra timestamp and flags parameters. Signed-off-by: Jeremy Allison Reviewed-by: Ralph Boehme --- diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c index e7158203c50..981bfbffe33 100644 --- a/examples/VFS/skel_opaque.c +++ b/examples/VFS/skel_opaque.c @@ -812,8 +812,10 @@ static ssize_t skel_fgetxattr(vfs_handle_struct *handle, return -1; } -static ssize_t skel_listxattr(vfs_handle_struct *handle, const char *path, - char *list, size_t size) +static ssize_t skel_listxattr(vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + char *list, + size_t size) { errno = ENOSYS; return -1; diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c index 05d67234845..ec7a9f1aee0 100644 --- a/examples/VFS/skel_transparent.c +++ b/examples/VFS/skel_transparent.c @@ -946,10 +946,12 @@ static ssize_t skel_fgetxattr(vfs_handle_struct *handle, return SMB_VFS_NEXT_FGETXATTR(handle, fsp, name, value, size); } -static ssize_t skel_listxattr(vfs_handle_struct *handle, const char *path, - char *list, size_t size) +static ssize_t skel_listxattr(vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + char *list, + size_t size) { - return SMB_VFS_NEXT_LISTXATTR(handle, path, list, size); + return SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size); } static ssize_t skel_flistxattr(vfs_handle_struct *handle, diff --git a/source3/include/vfs.h b/source3/include/vfs.h index f3a0b323923..7046513480d 100644 --- a/source3/include/vfs.h +++ b/source3/include/vfs.h @@ -205,6 +205,8 @@ to const struct smb_filename * */ /* Version 37 - Change sys_acl_set_file from const char * to const struct smb_filename * */ +/* Version 37 - Change listxattr from const char * + to const struct smb_filename * */ #define SMB_VFS_INTERFACE_VERSION 37 @@ -889,7 +891,10 @@ struct vfs_fn_pointers { /* EA operations. */ ssize_t (*getxattr_fn)(struct vfs_handle_struct *handle,const char *path, const char *name, void *value, size_t size); ssize_t (*fgetxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, void *value, size_t size); - ssize_t (*listxattr_fn)(struct vfs_handle_struct *handle, const char *path, char *list, size_t size); + ssize_t (*listxattr_fn)(struct vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + char *list, + size_t size); ssize_t (*flistxattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, char *list, size_t size); int (*removexattr_fn)(struct vfs_handle_struct *handle, const char *path, const char *name); int (*fremovexattr_fn)(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name); @@ -1354,7 +1359,9 @@ ssize_t smb_vfs_call_fgetxattr(struct vfs_handle_struct *handle, struct files_struct *fsp, const char *name, void *value, size_t size); ssize_t smb_vfs_call_listxattr(struct vfs_handle_struct *handle, - const char *path, char *list, size_t size); + const struct smb_filename *smb_fname, + char *list, + size_t size); ssize_t smb_vfs_call_llistxattr(struct vfs_handle_struct *handle, const char *path, char *list, size_t size); ssize_t smb_vfs_call_flistxattr(struct vfs_handle_struct *handle, diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h index ac04093b108..f5c0332cf20 100644 --- a/source3/include/vfs_macros.h +++ b/source3/include/vfs_macros.h @@ -525,10 +525,10 @@ #define SMB_VFS_NEXT_FGETXATTR(handle,fsp,name,value,size) \ smb_vfs_call_fgetxattr((handle)->next,(fsp),(name),(value),(size)) -#define SMB_VFS_LISTXATTR(conn,path,list,size) \ - smb_vfs_call_listxattr((conn)->vfs_handles,(path),(list),(size)) -#define SMB_VFS_NEXT_LISTXATTR(handle,path,list,size) \ - smb_vfs_call_listxattr((handle)->next,(path),(list),(size)) +#define SMB_VFS_LISTXATTR(conn,smb_fname,list,size) \ + smb_vfs_call_listxattr((conn)->vfs_handles,(smb_fname),(list),(size)) +#define SMB_VFS_NEXT_LISTXATTR(handle,smb_fname,list,size) \ + smb_vfs_call_listxattr((handle)->next,(smb_fname),(list),(size)) #define SMB_VFS_FLISTXATTR(fsp,list,size) \ smb_vfs_call_flistxattr((fsp)->conn->vfs_handles, (fsp), (list),(size)) diff --git a/source3/modules/vfs_cap.c b/source3/modules/vfs_cap.c index 8d621ccec5e..91f624ee96b 100644 --- a/source3/modules/vfs_cap.c +++ b/source3/modules/vfs_cap.c @@ -675,15 +675,40 @@ static ssize_t cap_fgetxattr(vfs_handle_struct *handle, struct files_struct *fsp return SMB_VFS_NEXT_FGETXATTR(handle, fsp, cappath, value, size); } -static ssize_t cap_listxattr(vfs_handle_struct *handle, const char *path, char *list, size_t size) +static ssize_t cap_listxattr(vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + char *list, + size_t size) { - char *cappath = capencode(talloc_tos(), path); + struct smb_filename *cap_smb_fname = NULL; + char *cappath = capencode(talloc_tos(), smb_fname->base_name); + ssize_t ret; + int saved_errno = 0; if (!cappath) { errno = ENOMEM; return -1; } - return SMB_VFS_NEXT_LISTXATTR(handle, cappath, list, size); + cap_smb_fname = synthetic_smb_fname(talloc_tos(), + cappath, + NULL, + NULL, + smb_fname->flags); + if (cap_smb_fname == NULL) { + TALLOC_FREE(cappath); + errno = ENOMEM; + return -1; + } + ret = SMB_VFS_NEXT_LISTXATTR(handle, cap_smb_fname, list, size); + if (ret == -1) { + saved_errno = errno; + } + TALLOC_FREE(cappath); + TALLOC_FREE(cap_smb_fname); + if (saved_errno) { + errno = saved_errno; + } + return ret; } static int cap_removexattr(vfs_handle_struct *handle, const char *path, const char *name) diff --git a/source3/modules/vfs_catia.c b/source3/modules/vfs_catia.c index 24fc26d122f..844f2418c60 100644 --- a/source3/modules/vfs_catia.c +++ b/source3/modules/vfs_catia.c @@ -1408,23 +1408,45 @@ catia_getxattr(vfs_handle_struct *handle, const char *path, } static ssize_t -catia_listxattr(vfs_handle_struct *handle, const char *path, +catia_listxattr(vfs_handle_struct *handle, + const struct smb_filename *smb_fname, char *list, size_t size) { + struct smb_filename *mapped_smb_fname = NULL; char *mapped_name = NULL; NTSTATUS status; ssize_t ret; + int saved_errno = 0; status = catia_string_replace_allocate(handle->conn, - path, &mapped_name, vfs_translate_to_unix); + smb_fname->base_name, + &mapped_name, + vfs_translate_to_unix); if (!NT_STATUS_IS_OK(status)) { errno = map_errno_from_nt_status(status); return -1; } + mapped_smb_fname = synthetic_smb_fname(talloc_tos(), + mapped_name, + NULL, + NULL, + smb_fname->flags); + if (mapped_smb_fname == NULL) { + TALLOC_FREE(mapped_name); + errno = ENOMEM; + return -1; + } - ret = SMB_VFS_NEXT_LISTXATTR(handle, mapped_name, list, size); + ret = SMB_VFS_NEXT_LISTXATTR(handle, mapped_smb_fname, list, size); + if (ret == -1) { + saved_errno = errno; + } TALLOC_FREE(mapped_name); + TALLOC_FREE(mapped_smb_fname); + if (saved_errno != 0) { + errno = saved_errno; + } return ret; } diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c index d819fe18dc3..874bd40d733 100644 --- a/source3/modules/vfs_ceph.c +++ b/source3/modules/vfs_ceph.c @@ -1247,11 +1247,15 @@ static ssize_t cephwrap_fgetxattr(struct vfs_handle_struct *handle, struct files } } -static ssize_t cephwrap_listxattr(struct vfs_handle_struct *handle, const char *path, char *list, size_t size) +static ssize_t cephwrap_listxattr(struct vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + char *list, + size_t size) { int ret; - DBG_DEBUG("[CEPH] listxattr(%p, %s, %p, %llu)\n", handle, path, list, llu(size)); - ret = ceph_listxattr(handle->data, path, list, size); + DBG_DEBUG("[CEPH] listxattr(%p, %s, %p, %llu)\n", handle, + smb_fname->base_name, list, llu(size)); + ret = ceph_listxattr(handle->data, smb_fname->base_name, list, size); DBG_DEBUG("[CEPH] listxattr(...) = %d\n", ret); if (ret < 0) { WRAP_RETURN(ret); diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index ad47f38105f..dfdcfb4f23d 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -2757,9 +2757,12 @@ static ssize_t vfswrap_fgetxattr(struct vfs_handle_struct *handle, struct files_ return fgetxattr(fsp->fh->fd, name, value, size); } -static ssize_t vfswrap_listxattr(struct vfs_handle_struct *handle, const char *path, char *list, size_t size) +static ssize_t vfswrap_listxattr(struct vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + char *list, + size_t size) { - return listxattr(path, list, size); + return listxattr(smb_fname->base_name, list, size); } static ssize_t vfswrap_flistxattr(struct vfs_handle_struct *handle, struct files_struct *fsp, char *list, size_t size) diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c index 07f01c27e99..f50f24d02b1 100644 --- a/source3/modules/vfs_full_audit.c +++ b/source3/modules/vfs_full_audit.c @@ -2284,13 +2284,16 @@ static ssize_t smb_full_audit_fgetxattr(struct vfs_handle_struct *handle, } static ssize_t smb_full_audit_listxattr(struct vfs_handle_struct *handle, - const char *path, char *list, size_t size) + const struct smb_filename *smb_fname, + char *list, + size_t size) { ssize_t result; - result = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size); + result = SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size); - do_log(SMB_VFS_OP_LISTXATTR, (result >= 0), handle, "%s", path); + do_log(SMB_VFS_OP_LISTXATTR, (result >= 0), handle, "%s", + smb_fname->base_name); return result; } diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c index 628dea79336..30629b8db6c 100644 --- a/source3/modules/vfs_glusterfs.c +++ b/source3/modules/vfs_glusterfs.c @@ -1316,9 +1316,11 @@ static ssize_t vfs_gluster_fgetxattr(struct vfs_handle_struct *handle, } static ssize_t vfs_gluster_listxattr(struct vfs_handle_struct *handle, - const char *path, char *list, size_t size) + const struct smb_filename *smb_fname, + char *list, + size_t size) { - return glfs_listxattr(handle->data, path, list, size); + return glfs_listxattr(handle->data, smb_fname->base_name, list, size); } static ssize_t vfs_gluster_flistxattr(struct vfs_handle_struct *handle, diff --git a/source3/modules/vfs_media_harmony.c b/source3/modules/vfs_media_harmony.c index 6915fb0e21e..2113e0310a1 100644 --- a/source3/modules/vfs_media_harmony.c +++ b/source3/modules/vfs_media_harmony.c @@ -2245,35 +2245,32 @@ out: * Failure: set errno, return -1 */ static ssize_t mh_listxattr(struct vfs_handle_struct *handle, - const char *path, + const struct smb_filename *smb_fname, char *list, size_t size) { ssize_t ret; - char *clientPath; - TALLOC_CTX *ctx; + struct smb_filename *clientFname = NULL; + int status; DEBUG(MH_INFO_DEBUG, ("Entering mh_listxattr\n")); - if (!is_in_media_files(path)) - { - ret = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size); + if (!is_in_media_files(smb_fname->base_name)) { + ret = SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size); goto out; } - clientPath = NULL; - ctx = talloc_tos(); - - if (alloc_get_client_path(handle, ctx, - path, - &clientPath)) - { + status = alloc_get_client_smb_fname(handle, + talloc_tos(), + smb_fname, + &clientFname); + if (status != 0) { ret = -1; goto err; } - ret = SMB_VFS_NEXT_LISTXATTR(handle, clientPath, list, size); + ret = SMB_VFS_NEXT_LISTXATTR(handle, clientFname, list, size); err: - TALLOC_FREE(clientPath); + TALLOC_FREE(clientFname); out: return ret; } diff --git a/source3/modules/vfs_posix_eadb.c b/source3/modules/vfs_posix_eadb.c index 129f0720d55..b5f92dff9c1 100644 --- a/source3/modules/vfs_posix_eadb.c +++ b/source3/modules/vfs_posix_eadb.c @@ -179,13 +179,15 @@ static ssize_t posix_eadb_listattr(struct tdb_wrap *db_ctx, } static ssize_t posix_eadb_listxattr(struct vfs_handle_struct *handle, - const char *path, char *list, size_t size) + const struct smb_filename *smb_fname, + char *list, + size_t size) { struct tdb_wrap *db; SMB_VFS_HANDLE_GET_DATA(handle, db, struct tdb_wrap, return -1); - return posix_eadb_listattr(db, path, -1, list, size); + return posix_eadb_listattr(db, smb_fname->base_name, -1, list, size); } static ssize_t posix_eadb_flistxattr(struct vfs_handle_struct *handle, diff --git a/source3/modules/vfs_shadow_copy2.c b/source3/modules/vfs_shadow_copy2.c index 6777d7a8208..74176793a14 100644 --- a/source3/modules/vfs_shadow_copy2.c +++ b/source3/modules/vfs_shadow_copy2.c @@ -2367,7 +2367,7 @@ static ssize_t shadow_copy2_getxattr(vfs_handle_struct *handle, } static ssize_t shadow_copy2_listxattr(struct vfs_handle_struct *handle, - const char *fname, + const struct smb_filename *smb_fname, char *list, size_t size) { time_t timestamp = 0; @@ -2375,23 +2375,37 @@ static ssize_t shadow_copy2_listxattr(struct vfs_handle_struct *handle, ssize_t ret; int saved_errno = 0; char *conv; + struct smb_filename *conv_smb_fname = NULL; - if (!shadow_copy2_strip_snapshot(talloc_tos(), handle, fname, - ×tamp, &stripped)) { + if (!shadow_copy2_strip_snapshot(talloc_tos(), + handle, + smb_fname->base_name, + ×tamp, + &stripped)) { return -1; } if (timestamp == 0) { - return SMB_VFS_NEXT_LISTXATTR(handle, fname, list, size); + return SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size); } conv = shadow_copy2_convert(talloc_tos(), handle, stripped, timestamp); TALLOC_FREE(stripped); if (conv == NULL) { return -1; } - ret = SMB_VFS_NEXT_LISTXATTR(handle, conv, list, size); + conv_smb_fname = synthetic_smb_fname(talloc_tos(), + conv, + NULL, + NULL, + smb_fname->flags); + if (conv_smb_fname == NULL) { + TALLOC_FREE(conv); + return -1; + } + ret = SMB_VFS_NEXT_LISTXATTR(handle, conv_smb_fname, list, size); if (ret == -1) { saved_errno = errno; } + TALLOC_FREE(conv_smb_fname); TALLOC_FREE(conv); if (saved_errno != 0) { errno = saved_errno; diff --git a/source3/modules/vfs_snapper.c b/source3/modules/vfs_snapper.c index 69e2ab90a62..bc98f78189a 100644 --- a/source3/modules/vfs_snapper.c +++ b/source3/modules/vfs_snapper.c @@ -2699,31 +2699,50 @@ static ssize_t snapper_gmt_getxattr(vfs_handle_struct *handle, } static ssize_t snapper_gmt_listxattr(struct vfs_handle_struct *handle, - const char *fname, + const struct smb_filename *smb_fname, char *list, size_t size) { - time_t timestamp; - char *stripped; + time_t timestamp = 0; + char *stripped = NULL; ssize_t ret; - int saved_errno; - char *conv; + int saved_errno = 0; + char *conv = NULL; + struct smb_filename *conv_smb_fname = NULL; - if (!snapper_gmt_strip_snapshot(talloc_tos(), handle, fname, - ×tamp, &stripped)) { + if (!snapper_gmt_strip_snapshot(talloc_tos(), + handle, + smb_fname->base_name, + ×tamp, + &stripped)) { return -1; } if (timestamp == 0) { - return SMB_VFS_NEXT_LISTXATTR(handle, fname, list, size); + return SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size); } conv = snapper_gmt_convert(talloc_tos(), handle, stripped, timestamp); TALLOC_FREE(stripped); if (conv == NULL) { return -1; } - ret = SMB_VFS_NEXT_LISTXATTR(handle, conv, list, size); - saved_errno = errno; + conv_smb_fname = synthetic_smb_fname(talloc_tos(), + conv, + NULL, + NULL, + smb_fname->flags); TALLOC_FREE(conv); - errno = saved_errno; + if (conv_smb_fname == NULL) { + errno = ENOMEM; + return -1; + } + ret = SMB_VFS_NEXT_LISTXATTR(handle, conv_smb_fname, list, size); + if (ret == -1) { + saved_errno = errno; + } + TALLOC_FREE(conv_smb_fname); + TALLOC_FREE(conv); + if (saved_errno != 0) { + errno = saved_errno; + } return ret; } diff --git a/source3/modules/vfs_time_audit.c b/source3/modules/vfs_time_audit.c index 2a2f084cdd8..e260c4727e3 100644 --- a/source3/modules/vfs_time_audit.c +++ b/source3/modules/vfs_time_audit.c @@ -2362,7 +2362,8 @@ static ssize_t smb_time_audit_fgetxattr(struct vfs_handle_struct *handle, } static ssize_t smb_time_audit_listxattr(struct vfs_handle_struct *handle, - const char *path, char *list, + const struct smb_filename *smb_fname, + char *list, size_t size) { ssize_t result; @@ -2370,12 +2371,13 @@ static ssize_t smb_time_audit_listxattr(struct vfs_handle_struct *handle, double timediff; clock_gettime_mono(&ts1); - result = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size); + result = SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size); clock_gettime_mono(&ts2); timediff = nsec_time_diff(&ts2,&ts1)*1.0e-9; if (timediff > audit_timeout) { - smb_time_audit_log_fname("listxattr", timediff, path); + smb_time_audit_log_fname("listxattr", timediff, + smb_fname->base_name); } return result; diff --git a/source3/modules/vfs_unityed_media.c b/source3/modules/vfs_unityed_media.c index 21d5416568e..7b60856ae75 100644 --- a/source3/modules/vfs_unityed_media.c +++ b/source3/modules/vfs_unityed_media.c @@ -1750,31 +1750,33 @@ err: } static ssize_t um_listxattr(struct vfs_handle_struct *handle, - const char *path, + const struct smb_filename *smb_fname, char *list, size_t size) { ssize_t ret; - char *client_path = NULL; + struct smb_filename *client_fname = NULL; int status; DEBUG(10, ("Entering um_listxattr\n")); - if (!is_in_media_files(path)) { - return SMB_VFS_NEXT_LISTXATTR(handle, path, list, size); + if (!is_in_media_files(smb_fname->base_name)) { + return SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size); } - status = alloc_get_client_path(handle, talloc_tos(), - path, &client_path); + status = alloc_get_client_smb_fname(handle, + talloc_tos(), + smb_fname, + &client_fname); if (status != 0) { ret = -1; goto err; } - ret = SMB_VFS_NEXT_LISTXATTR(handle, client_path, list, size); + ret = SMB_VFS_NEXT_LISTXATTR(handle, client_fname, list, size); err: - TALLOC_FREE(client_path); + TALLOC_FREE(client_fname); return ret; } diff --git a/source3/modules/vfs_vxfs.c b/source3/modules/vfs_vxfs.c index 5dc9ba2cfe3..c678636d14a 100644 --- a/source3/modules/vfs_vxfs.c +++ b/source3/modules/vfs_vxfs.c @@ -752,17 +752,19 @@ static size_t vxfs_filter_list(char *list, size_t size) return size; } -static ssize_t vxfs_listxattr(vfs_handle_struct *handle, const char *path, - char *list, size_t size) +static ssize_t vxfs_listxattr(vfs_handle_struct *handle, + const struct smb_filename *smb_fname, + char *list, + size_t size) { ssize_t result; - result = vxfs_listxattr_path(path, list, size); + result = vxfs_listxattr_path(smb_fname->base_name, list, size); if (result >= 0 || ((errno != ENOTSUP) && (errno != ENOSYS))) { return result; } - result = SMB_VFS_NEXT_LISTXATTR(handle, path, list, size); + result = SMB_VFS_NEXT_LISTXATTR(handle, smb_fname, list, size); if (result <= 0) { return result; diff --git a/source3/modules/vfs_xattr_tdb.c b/source3/modules/vfs_xattr_tdb.c index 12ccbca5920..a4f80b20eda 100644 --- a/source3/modules/vfs_xattr_tdb.c +++ b/source3/modules/vfs_xattr_tdb.c @@ -204,7 +204,9 @@ static int xattr_tdb_fsetxattr(struct vfs_handle_struct *handle, } static ssize_t xattr_tdb_listxattr(struct vfs_handle_struct *handle, - const char *path, char *list, size_t size) + const struct smb_filename *smb_fname, + char *list, + size_t size) { struct file_id id; struct db_context *db; @@ -217,7 +219,7 @@ static ssize_t xattr_tdb_listxattr(struct vfs_handle_struct *handle, TALLOC_FREE(frame); return -1; }); - ret = xattr_tdb_get_file_id(handle, path, &id); + ret = xattr_tdb_get_file_id(handle, smb_fname->base_name, &id); if (ret == -1) { TALLOC_FREE(frame); return -1; diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index a44de7e7b3a..8c1190b5d30 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -289,7 +289,7 @@ NTSTATUS get_ea_names_from_file(TALLOC_CTX *mem_ctx, ea_namelist_size); } else { sizeret = SMB_VFS_LISTXATTR(conn, - smb_fname->base_name, + smb_fname, ea_namelist, ea_namelist_size); } @@ -307,7 +307,7 @@ NTSTATUS get_ea_names_from_file(TALLOC_CTX *mem_ctx, ea_namelist_size); } else { sizeret = SMB_VFS_LISTXATTR(conn, - smb_fname->base_name, + smb_fname, ea_namelist, ea_namelist_size); } diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index fc0a519383b..d27ab397419 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -2519,10 +2519,12 @@ ssize_t smb_vfs_call_fgetxattr(struct vfs_handle_struct *handle, } ssize_t smb_vfs_call_listxattr(struct vfs_handle_struct *handle, - const char *path, char *list, size_t size) + const struct smb_filename *smb_fname, + char *list, + size_t size) { VFS_FIND(listxattr); - return handle->fns->listxattr_fn(handle, path, list, size); + return handle->fns->listxattr_fn(handle, smb_fname, list, size); } ssize_t smb_vfs_call_flistxattr(struct vfs_handle_struct *handle, diff --git a/source3/torture/cmd_vfs.c b/source3/torture/cmd_vfs.c index 0bb29035972..7155ac3a170 100644 --- a/source3/torture/cmd_vfs.c +++ b/source3/torture/cmd_vfs.c @@ -1344,6 +1344,7 @@ static NTSTATUS cmd_listxattr(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, { char *buf, *p; ssize_t ret; + struct smb_filename *smb_fname = NULL; if (argc != 2) { printf("Usage: listxattr \n"); @@ -1352,7 +1353,14 @@ static NTSTATUS cmd_listxattr(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, buf = NULL; - ret = SMB_VFS_LISTXATTR(vfs->conn, argv[1], buf, talloc_get_size(buf)); + smb_fname = synthetic_smb_fname_split(mem_ctx, + argv[1], + lp_posix_pathnames()); + if (smb_fname == NULL) { + return NT_STATUS_NO_MEMORY; + } + ret = SMB_VFS_LISTXATTR(vfs->conn, smb_fname, + buf, talloc_get_size(buf)); if (ret == -1) { int err = errno; printf("listxattr returned (%s)\n", strerror(err)); @@ -1362,7 +1370,8 @@ static NTSTATUS cmd_listxattr(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, if (buf == NULL) { return NT_STATUS_NO_MEMORY; } - ret = SMB_VFS_LISTXATTR(vfs->conn, argv[1], buf, talloc_get_size(buf)); + ret = SMB_VFS_LISTXATTR(vfs->conn, smb_fname, + buf, talloc_get_size(buf)); if (ret == -1) { int err = errno; printf("listxattr returned (%s)\n", strerror(err));