From 178db7cea5f33144b438c5e49ef65024e10d0a0f Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 1 May 2015 13:09:36 -0700 Subject: [PATCH] s3: smbd: VFS: All the places that are currently calling vfs_stat_smb_fname() and vfs_lstat_smb_fname() should be calling vfs_stat_smb_basename(). They are all post-stream name processing. BUG: https://bugzilla.samba.org/show_bug.cgi?id=11249 Signed-off-by: Jeremy Allison Reviewed-by: Andreas Schneider Reviewed-by: Ralph Boehme (cherry picked from commit 14f4e254bb8d1f456ebb8da728f2fb812a9b3034) --- source3/modules/nfs4_acls.c | 4 ++-- source3/modules/vfs_acl_common.c | 19 ++++++++++++++++++- source3/modules/vfs_acl_tdb.c | 16 +++------------- source3/modules/vfs_recycle.c | 2 +- source3/modules/vfs_solarisacl.c | 2 +- source3/modules/vfs_xattr_tdb.c | 2 +- 6 files changed, 26 insertions(+), 19 deletions(-) diff --git a/source3/modules/nfs4_acls.c b/source3/modules/nfs4_acls.c index 500cb4772a3..c7542db5b69 100644 --- a/source3/modules/nfs4_acls.c +++ b/source3/modules/nfs4_acls.c @@ -282,9 +282,9 @@ static int smbacl4_GetFileOwner(struct connection_struct *conn, memset(psbuf, 0, sizeof(SMB_STRUCT_STAT)); /* Get the stat struct for the owner info. */ - if (vfs_stat_smb_fname(conn, filename, psbuf) != 0) + if (vfs_stat_smb_basename(conn, filename, psbuf) != 0) { - DEBUG(8, ("vfs_stat_smb_fname failed with error %s\n", + DEBUG(8, ("vfs_stat_smb_basename failed with error %s\n", strerror(errno))); return -1; } diff --git a/source3/modules/vfs_acl_common.c b/source3/modules/vfs_acl_common.c index 57fc6c8924e..c9124a573a8 100644 --- a/source3/modules/vfs_acl_common.c +++ b/source3/modules/vfs_acl_common.c @@ -617,7 +617,24 @@ static NTSTATUS get_nt_acl_internal(vfs_handle_struct *handle, } psbuf = &fsp->fsp_name->st; } else { - int ret = vfs_stat_smb_fname(handle->conn, + /* + * https://bugzilla.samba.org/show_bug.cgi?id=11249 + * + * We are currently guaranteed that 'name' here is + * a smb_fname->base_name, which *cannot* contain + * a stream name (':'). vfs_stat_smb_fname() splits + * a name into a base name + stream name, which + * when we get here we know we've already done. + * So we have to call the stat or lstat VFS + * calls directly here. Else, a base_name that + * contains a ':' (from a demangled name) will + * get split again. + * + * FIXME. + * This uglyness will go away once smb_fname + * is fully plumbed through the VFS. + */ + int ret = vfs_stat_smb_basename(handle->conn, name, &sbuf); if (ret == -1) { diff --git a/source3/modules/vfs_acl_tdb.c b/source3/modules/vfs_acl_tdb.c index 80839e33623..ec0aaa4dc5c 100644 --- a/source3/modules/vfs_acl_tdb.c +++ b/source3/modules/vfs_acl_tdb.c @@ -159,7 +159,7 @@ static NTSTATUS get_acl_blob(TALLOC_CTX *ctx, status = vfs_stat_fsp(fsp); sbuf = fsp->fsp_name->st; } else { - int ret = vfs_stat_smb_fname(handle->conn, name, &sbuf); + int ret = vfs_stat_smb_basename(handle->conn, name, &sbuf); if (ret == -1) { status = map_nt_error_from_unix(errno); } @@ -282,12 +282,7 @@ static int rmdir_acl_tdb(vfs_handle_struct *handle, const char *path) struct db_context *db = acl_db; int ret = -1; - if (lp_posix_pathnames()) { - ret = vfs_lstat_smb_fname(handle->conn, path, &sbuf); - } else { - ret = vfs_stat_smb_fname(handle->conn, path, &sbuf); - } - + ret = vfs_stat_smb_basename(handle->conn, path, &sbuf); if (ret == -1) { return -1; } @@ -347,12 +342,7 @@ static int sys_acl_set_file_tdb(vfs_handle_struct *handle, struct db_context *db = acl_db; int ret = -1; - if (lp_posix_pathnames()) { - ret = vfs_lstat_smb_fname(handle->conn, path, &sbuf); - } else { - ret = vfs_stat_smb_fname(handle->conn, path, &sbuf); - } - + ret = vfs_stat_smb_basename(handle->conn, path, &sbuf); if (ret == -1) { return -1; } diff --git a/source3/modules/vfs_recycle.c b/source3/modules/vfs_recycle.c index 00d7f34f2f7..9af78fd5aa5 100644 --- a/source3/modules/vfs_recycle.c +++ b/source3/modules/vfs_recycle.c @@ -188,7 +188,7 @@ static bool recycle_directory_exist(vfs_handle_struct *handle, const char *dname { SMB_STRUCT_STAT st; - if (vfs_stat_smb_fname(handle->conn, dname, &st) == 0) { + if (vfs_stat_smb_basename(handle->conn, dname, &st) == 0) { if (S_ISDIR(st.st_ex_mode)) { return True; } diff --git a/source3/modules/vfs_solarisacl.c b/source3/modules/vfs_solarisacl.c index 9b3c4f60a56..efd2d75e64a 100644 --- a/source3/modules/vfs_solarisacl.c +++ b/source3/modules/vfs_solarisacl.c @@ -167,7 +167,7 @@ int solarisacl_sys_acl_set_file(vfs_handle_struct *handle, * that has not been specified in "type" from the file first * and concatenate it with the acl provided. */ - if (vfs_stat_smb_fname(handle->conn, name, &s) != 0) { + if (vfs_stat_smb_basename(handle->conn, name, &s) != 0) { DEBUG(10, ("Error in stat call: %s\n", strerror(errno))); goto done; } diff --git a/source3/modules/vfs_xattr_tdb.c b/source3/modules/vfs_xattr_tdb.c index 43456cf6100..590ffaad2d5 100644 --- a/source3/modules/vfs_xattr_tdb.c +++ b/source3/modules/vfs_xattr_tdb.c @@ -414,7 +414,7 @@ static int xattr_tdb_rmdir(vfs_handle_struct *handle, const char *path) TALLOC_FREE(frame); return -1; }); - if (vfs_stat_smb_fname(handle->conn, path, &sbuf) == -1) { + if (vfs_stat_smb_basename(handle->conn, path, &sbuf) == -1) { TALLOC_FREE(frame); return -1; } -- 2.11.4.GIT