From 377c7b311e427a302b27f3512373e881de432081 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Thu, 10 Mar 2016 16:05:48 -0800 Subject: [PATCH] s3:smbd:vfs: Change posix_get_nt_acl() from const char * to const struct smb_filename *. Signed-off-by: Jeremy Allison Reviewed-by: Ralph Boehme --- source3/modules/vfs_aixacl2.c | 2 +- source3/modules/vfs_default.c | 2 +- source3/modules/vfs_gpfs.c | 2 +- source3/smbd/posix_acls.c | 48 +++++++++++++++++++++-------------- source3/smbd/proto.h | 9 ++++--- 5 files changed, 37 insertions(+), 26 deletions(-) diff --git a/source3/modules/vfs_aixacl2.c b/source3/modules/vfs_aixacl2.c index 0efcc001f99..1c9f84bf2a8 100644 --- a/source3/modules/vfs_aixacl2.c +++ b/source3/modules/vfs_aixacl2.c @@ -204,7 +204,7 @@ static NTSTATUS aixjfs2_get_nt_acl(vfs_handle_struct *handle, { DEBUG(10, ("retrying with posix acl...\n")); return posix_get_nt_acl(handle->conn, - smb_fname->base_name, + smb_fname, security_info, mem_ctx, ppdesc); diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c index ee9ddb20e5f..ea7dc2caf99 100644 --- a/source3/modules/vfs_default.c +++ b/source3/modules/vfs_default.c @@ -2344,7 +2344,7 @@ static NTSTATUS vfswrap_get_nt_acl(vfs_handle_struct *handle, START_PROFILE(get_nt_acl); result = posix_get_nt_acl(handle->conn, - smb_fname->base_name, + smb_fname, security_info, mem_ctx, ppdesc); diff --git a/source3/modules/vfs_gpfs.c b/source3/modules/vfs_gpfs.c index c9cc88d10db..09e37fa7f53 100644 --- a/source3/modules/vfs_gpfs.c +++ b/source3/modules/vfs_gpfs.c @@ -622,7 +622,7 @@ static NTSTATUS gpfsacl_get_nt_acl(vfs_handle_struct *handle, if (result > 0) { DEBUG(10, ("retrying with posix acl...\n")); - status = posix_get_nt_acl(handle->conn, smb_fname->base_name, + status = posix_get_nt_acl(handle->conn, smb_fname, security_info, mem_ctx, ppdesc); TALLOC_FREE(frame); return status; diff --git a/source3/smbd/posix_acls.c b/source3/smbd/posix_acls.c index ac296e24ea0..c4eeb9c4bd9 100644 --- a/source3/smbd/posix_acls.c +++ b/source3/smbd/posix_acls.c @@ -3516,7 +3516,7 @@ NTSTATUS posix_fget_nt_acl(struct files_struct *fsp, uint32_t security_info, /* can it happen that fsp_name == NULL ? */ if (fsp->is_directory || fsp->fh->fd == -1) { - status = posix_get_nt_acl(fsp->conn, fsp->fsp_name->base_name, + status = posix_get_nt_acl(fsp->conn, fsp->fsp_name, security_info, mem_ctx, ppdesc); TALLOC_FREE(frame); return status; @@ -3540,31 +3540,36 @@ NTSTATUS posix_fget_nt_acl(struct files_struct *fsp, uint32_t security_info, return status; } -NTSTATUS posix_get_nt_acl(struct connection_struct *conn, const char *name, - uint32_t security_info, - TALLOC_CTX *mem_ctx, - struct security_descriptor **ppdesc) +NTSTATUS posix_get_nt_acl(struct connection_struct *conn, + const struct smb_filename *smb_fname_in, + uint32_t security_info, + TALLOC_CTX *mem_ctx, + struct security_descriptor **ppdesc) { SMB_ACL_T posix_acl = NULL; SMB_ACL_T def_acl = NULL; struct pai_val *pal; - struct smb_filename smb_fname; + struct smb_filename *smb_fname = NULL; int ret; TALLOC_CTX *frame = talloc_stackframe(); NTSTATUS status; *ppdesc = NULL; - DEBUG(10,("posix_get_nt_acl: called for file %s\n", name )); + DEBUG(10,("posix_get_nt_acl: called for file %s\n", + smb_fname_in->base_name )); - ZERO_STRUCT(smb_fname); - smb_fname.base_name = discard_const_p(char, name); + smb_fname = cp_smb_filename(talloc_tos(), smb_fname_in); + if (smb_fname == NULL) { + TALLOC_FREE(frame); + return NT_STATUS_NO_MEMORY; + } /* Get the stat struct for the owner info. */ if (lp_posix_pathnames()) { - ret = SMB_VFS_LSTAT(conn, &smb_fname); + ret = SMB_VFS_LSTAT(conn, smb_fname); } else { - ret = SMB_VFS_STAT(conn, &smb_fname); + ret = SMB_VFS_STAT(conn, smb_fname); } if (ret == -1) { @@ -3573,22 +3578,27 @@ NTSTATUS posix_get_nt_acl(struct connection_struct *conn, const char *name, } /* Get the ACL from the path. */ - posix_acl = SMB_VFS_SYS_ACL_GET_FILE(conn, name, + posix_acl = SMB_VFS_SYS_ACL_GET_FILE(conn, smb_fname->base_name, SMB_ACL_TYPE_ACCESS, frame); /* If it's a directory get the default POSIX ACL. */ - if(S_ISDIR(smb_fname.st.st_ex_mode)) { - def_acl = SMB_VFS_SYS_ACL_GET_FILE(conn, name, + if(S_ISDIR(smb_fname->st.st_ex_mode)) { + def_acl = SMB_VFS_SYS_ACL_GET_FILE(conn, smb_fname->base_name, SMB_ACL_TYPE_DEFAULT, frame); def_acl = free_empty_sys_acl(conn, def_acl); } - pal = load_inherited_info(conn, name); + pal = load_inherited_info(conn, smb_fname->base_name); - status = posix_get_nt_acl_common(conn, name, &smb_fname.st, pal, - posix_acl, def_acl, security_info, - mem_ctx, - ppdesc); + status = posix_get_nt_acl_common(conn, + smb_fname->base_name, + &smb_fname->st, + pal, + posix_acl, + def_acl, + security_info, + mem_ctx, + ppdesc); TALLOC_FREE(frame); return status; } diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index e1ec063226f..f9ae4a3047b 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -751,10 +751,11 @@ SMB_ACL_T free_empty_sys_acl(connection_struct *conn, SMB_ACL_T the_acl); NTSTATUS posix_fget_nt_acl(struct files_struct *fsp, uint32_t security_info, TALLOC_CTX *mem_ctx, struct security_descriptor **ppdesc); -NTSTATUS posix_get_nt_acl(struct connection_struct *conn, const char *name, - uint32_t security_info, - TALLOC_CTX *mem_ctx, - struct security_descriptor **ppdesc); +NTSTATUS posix_get_nt_acl(struct connection_struct *conn, + const struct smb_filename *smb_fname_in, + uint32_t security_info, + TALLOC_CTX *mem_ctx, + struct security_descriptor **ppdesc); NTSTATUS try_chown(files_struct *fsp, uid_t uid, gid_t gid); NTSTATUS set_nt_acl(files_struct *fsp, uint32_t security_info_sent, const struct security_descriptor *psd); int get_acl_group_bits( connection_struct *conn, const char *fname, mode_t *mode ); -- 2.34.1