[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Fri Mar 25 01:24:03 UTC 2016


The branch, master has been updated
       via  8151ac2 s3: torture. Remove spurious lp_posix_pathnames() included by cut-and-paste error.
       via  6ae59eb s3: smbd: Modify vfs_stat_smb_basename() to take a const struct smb_filename * instead of const char *.
       via  125a1b5 s3: vfs: vfs_acl_tdb. Remove use of vfs_stat_smb_basename().
       via  f9dc022 s3: vfs: recycle. Remove use of vfs_stat_smb_basename().
       via  ce75fbf s3: smbd: Remove many common uses of lp_posix_pathnames().
       via  be56fff s3: smbd: Remove unneeded lp_posix_pathnames() check in SMB2 create.
       via  0f245c5 s3: posix_acls. Always use STAT, not LSTAT here.
       via  91c385c s3: vfs: Remove use of lp_posix_pathnames() below the VFS.
       via  dc5dad4 s3: Filenames: Add uint32_t flags parameter to synthetic_smb_fname().
       via  2e302d7 s3: smbd: Add uint32_t flags field to struct smb_filename.
       via  09325a0 s3:smbd: Move lp_posix_pathnames() out of ea_list_has_invalid_name().
       via  feb297c s3: vfs: vfs_afsacl. refuse_symlink() means we can always use STAT here.
       via  8d8c204 s3:smbd: Fix build for vfs_afsacl.c.
       via  8c90799 Fix an obvious error where we were converting a UNIX error to an NT STATUS but not returning it.
      from  5dccb19 selftest/Samba3: use the correct "SELFTEST_WINBINDD_SOCKET_DIR" for "net join"

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 8151ac21108374cd5b97cc22a81fe9097df8ee23
Author: Jeremy Allison <jra at samba.org>
Date:   Sat Mar 19 21:07:01 2016 -0700

    s3: torture. Remove spurious lp_posix_pathnames() included by cut-and-paste error.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Fri Mar 25 02:23:56 CET 2016 on sn-devel-144

commit 6ae59eb6d1d2b4a9f3a7c1094c18abe6594aace2
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Mar 18 22:17:30 2016 -0700

    s3: smbd: Modify vfs_stat_smb_basename() to take a const struct smb_filename * instead of const char *.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 125a1b50ab2532614cb7e53b2e2979666b02702f
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Mar 18 22:15:12 2016 -0700

    s3: vfs: vfs_acl_tdb. Remove use of vfs_stat_smb_basename().
    
    We only need a basic STAT here.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit f9dc02266c799d87f1dba7147f41b6946e0ba4c0
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Mar 18 22:10:34 2016 -0700

    s3: vfs: recycle. Remove use of vfs_stat_smb_basename().
    
    We only need a basic STAT here.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit ce75fbf4e3e59f6be131807e198045485646855f
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Mar 18 21:58:20 2016 -0700

    s3: smbd: Remove many common uses of lp_posix_pathnames().
    
    Check the smb_filename->flags field, or req->posix_pathnames
    instead, depending on what is available.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit be56fffe4b83ed14a5e84a5023d5c7a826911261
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Mar 18 21:55:05 2016 -0700

    s3: smbd: Remove unneeded lp_posix_pathnames() check in SMB2 create.
    
    Add a comment reminding me to re-add the check when SMB2
    unix extensions are re-added.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 0f245c5ff4f175873f94b108b506527ee06d2a28
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Mar 18 21:50:15 2016 -0700

    s3: posix_acls. Always use STAT, not LSTAT here.
    
    We have already refused acls on a symlink.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 91c385cfd3420873ad87731da0742e4d07bc4020
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Mar 18 21:31:22 2016 -0700

    s3: vfs: Remove use of lp_posix_pathnames() below the VFS.
    
    We don't have access to a struct smb_filename here and
    can't get one, so simply always set AT_SYMLINK_NOFOLLOW
    and remove the optimization if we ended up fstatat()'ing
    a symlink, as we don't know if the caller wanted a link
    stat or not.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit dc5dad48139a3dcb4544e4f31aabe269f6401849
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Mar 18 21:19:38 2016 -0700

    s3: Filenames: Add uint32_t flags parameter to synthetic_smb_fname().
    
    Get it from parent/deriving smb_filename if present.
    Use 0 (as usually this a Windows-style lookup) if
    not.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 2e302d7007a58df972f7e63382ee8c9729f80560
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Mar 17 16:20:17 2016 -0700

    s3: smbd: Add uint32_t flags field to struct smb_filename.
    
    Only one defined flag for now, SMB_FILENAME_POSIX_PATH.
    Define as the same as FSP_POSIX_FLAGS_PATHNAMES to keep
    the value consistent.
    
    Set this inside unix_convert() when a posix path parse
    is selected.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 09325a0ea64e43c2a4059289e3379e5543a6b76a
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Mar 15 11:43:32 2016 -0700

    s3:smbd: Move lp_posix_pathnames() out of ea_list_has_invalid_name().
    
    External uses will be replaced by checks on struct smb_filename flags.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit feb297ca73c03907cf1f379a97a4707ad034e7c3
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Mar 15 11:46:58 2016 -0700

    s3: vfs: vfs_afsacl. refuse_symlink() means we can always use STAT here.
    
    For a posix acl call on a symlink, we've already refused it.
    For a Windows acl mapped call on a symlink, we want to follow
    it.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 8d8c204d37a2adb9e20a3de81da6cda138089dce
Author: Jeremy Allison <jra at samba.org>
Date:   Thu Mar 17 16:44:50 2016 -0700

    s3:smbd: Fix build for vfs_afsacl.c.
    
    Missed conversion of get_nt_acl_fn from const char *
    to const struct smb_filename *.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Uri Simchoni <uri at samba.org>

commit 8c9079991d61d3a140f0340fd166e3421c25b694
Author: Richard Sharpe <rsharpe at samba.org>
Date:   Wed Mar 23 21:56:30 2016 -0700

    Fix an obvious error where we were converting a UNIX error to an NT STATUS but not returning it.
    
    Signed-off-by: Richard Sharpe <rsharpe at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/include/proto.h                |  3 +-
 source3/include/vfs.h                  |  9 ++++
 source3/lib/filename_util.c            | 19 +++++----
 source3/modules/nfs4_acls.c            |  2 +-
 source3/modules/non_posix_acls.c       |  2 +-
 source3/modules/vfs_acl_common.c       |  6 +--
 source3/modules/vfs_acl_tdb.c          | 14 ++++---
 source3/modules/vfs_afsacl.c           | 31 ++++++--------
 source3/modules/vfs_cap.c              | 21 ++++++----
 source3/modules/vfs_catia.c            | 27 ++++++++----
 source3/modules/vfs_default.c          | 18 +++++---
 source3/modules/vfs_fake_acls.c        |  2 +-
 source3/modules/vfs_fruit.c            | 22 +++++++---
 source3/modules/vfs_gpfs.c             |  2 +-
 source3/modules/vfs_hpuxacl.c          |  2 +-
 source3/modules/vfs_media_harmony.c    |  6 ++-
 source3/modules/vfs_nfs4acl_xattr.c    |  2 +-
 source3/modules/vfs_posix_eadb.c       |  2 +-
 source3/modules/vfs_recycle.c          | 18 +++++---
 source3/modules/vfs_shadow_copy.c      |  3 +-
 source3/modules/vfs_shadow_copy2.c     | 27 ++++++++----
 source3/modules/vfs_snapper.c          | 24 +++++++----
 source3/modules/vfs_streams_depot.c    | 77 ++++++++++++++++++++++++----------
 source3/modules/vfs_streams_xattr.c    | 18 +++++---
 source3/modules/vfs_unityed_media.c    |  6 ++-
 source3/modules/vfs_vxfs.c             |  2 +-
 source3/modules/vfs_xattr_tdb.c        |  6 +--
 source3/printing/nt_printing.c         |  2 +-
 source3/printing/printspoolss.c        |  2 +-
 source3/rpc_server/fss/srv_fss_agent.c |  2 +-
 source3/smbd/close.c                   | 17 +++++---
 source3/smbd/dir.c                     | 14 +++++--
 source3/smbd/dosmode.c                 | 16 ++++---
 source3/smbd/durable.c                 |  7 +++-
 source3/smbd/file_access.c             |  9 +++-
 source3/smbd/filename.c                |  5 ++-
 source3/smbd/files.c                   |  2 +-
 source3/smbd/msdfs.c                   | 19 ++++++---
 source3/smbd/nttrans.c                 |  3 +-
 source3/smbd/open.c                    | 38 +++++++++++------
 source3/smbd/pipes.c                   |  2 +-
 source3/smbd/posix_acls.c              | 17 ++++----
 source3/smbd/proto.h                   |  3 +-
 source3/smbd/pysmbd.c                  | 12 ++++--
 source3/smbd/reply.c                   | 12 ++++--
 source3/smbd/service.c                 |  7 +++-
 source3/smbd/smb2_create.c             |  6 +++
 source3/smbd/trans2.c                  | 62 ++++++++++++++++++++-------
 source3/smbd/vfs.c                     | 19 +++++----
 source3/torture/cmd_vfs.c              | 29 +++++++++----
 source3/torture/torture.c              |  2 +-
 51 files changed, 456 insertions(+), 222 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index dc8fee9..8cdbadf 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -1139,7 +1139,8 @@ NTSTATUS get_full_smb_filename(TALLOC_CTX *ctx, const struct smb_filename *smb_f
 struct smb_filename *synthetic_smb_fname(TALLOC_CTX *mem_ctx,
 					 const char *base_name,
 					 const char *stream_name,
-					 const SMB_STRUCT_STAT *psbuf);
+					 const SMB_STRUCT_STAT *psbuf,
+					 uint32_t flags);
 struct smb_filename *synthetic_smb_fname_split(TALLOC_CTX *ctx,
 						const char *fname,
 						bool posix_path);
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index 1c6bc2f..3a86c62 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -190,6 +190,7 @@
 		const struct smb_filename * */
 /* Version 35 - Change streaminfo from const char *, to
 		const struct smb_filename * */
+/* Version 35 - Add uint32_t flags to struct smb_filename */
 
 #define SMB_VFS_INTERFACE_VERSION 35
 
@@ -514,9 +515,17 @@ struct smb_filename {
 	char *base_name;
 	char *stream_name;
 	char *original_lcomp;
+	uint32_t flags;
 	SMB_STRUCT_STAT st;
 };
 
+/*
+ * smb_filename flags. Define in terms of the FSP_POSIX_FLAGS_XX
+ * to keep the numeric values consistent.
+ */
+
+#define SMB_FILENAME_POSIX_PATH		FSP_POSIX_FLAGS_PATHNAMES
+
 #define VFS_FIND(__fn__) while (handle->fns->__fn__##_fn==NULL) { \
 				handle = handle->next; \
 			 }
diff --git a/source3/lib/filename_util.c b/source3/lib/filename_util.c
index 6ee91ec..3983aaa 100644
--- a/source3/lib/filename_util.c
+++ b/source3/lib/filename_util.c
@@ -53,13 +53,15 @@ NTSTATUS get_full_smb_filename(TALLOC_CTX *ctx,
 struct smb_filename *synthetic_smb_fname(TALLOC_CTX *mem_ctx,
 					 const char *base_name,
 					 const char *stream_name,
-					 const SMB_STRUCT_STAT *psbuf)
+					 const SMB_STRUCT_STAT *psbuf,
+					 uint32_t flags)
 {
 	struct smb_filename smb_fname_loc = { 0, };
 
 	/* Setup the base_name/stream_name. */
 	smb_fname_loc.base_name = discard_const_p(char, base_name);
 	smb_fname_loc.stream_name = discard_const_p(char, stream_name);
+	smb_fname_loc.flags = flags;
 
 	/* Copy the psbuf if one was given. */
 	if (psbuf)
@@ -83,7 +85,11 @@ struct smb_filename *synthetic_smb_fname_split(TALLOC_CTX *ctx,
 
 	if (posix_path) {
 		/* No stream name looked for. */
-		return synthetic_smb_fname(ctx, fname, NULL, NULL);
+		return synthetic_smb_fname(ctx,
+				fname,
+				NULL,
+				NULL,
+				SMB_FILENAME_POSIX_PATH);
 	}
 
 	ok = split_stream_filename(ctx,
@@ -94,7 +100,7 @@ struct smb_filename *synthetic_smb_fname_split(TALLOC_CTX *ctx,
 		return NULL;
 	}
 
-	ret = synthetic_smb_fname(ctx, base_name, stream_name, NULL);
+	ret = synthetic_smb_fname(ctx, base_name, stream_name, NULL, 0);
 	TALLOC_FREE(base_name);
 	TALLOC_FREE(stream_name);
 	return ret;
@@ -212,6 +218,7 @@ struct smb_filename *cp_smb_filename(TALLOC_CTX *mem_ctx,
 		talloc_set_name_const(out->original_lcomp,
 				      out->original_lcomp);
 	}
+	out->flags = in->flags;
 	out->st = in->st;
 	return out;
 }
@@ -226,7 +233,7 @@ bool is_ntfs_stream_smb_fname(const struct smb_filename *smb_fname)
 		SMB_ASSERT(smb_fname->stream_name[0] != '\0');
 	}
 
-	if (lp_posix_pathnames()) {
+	if (smb_fname->flags & SMB_FILENAME_POSIX_PATH) {
 		return false;
 	}
 
@@ -267,10 +274,6 @@ bool is_invalid_windows_ea_name(const char *name)
 
 bool ea_list_has_invalid_name(struct ea_list *ea_list)
 {
-	if (lp_posix_pathnames()) {
-		return false;
-	}
-
 	for (;ea_list; ea_list = ea_list->next) {
 		if (is_invalid_windows_ea_name(ea_list->ea.name)) {
 			return true;
diff --git a/source3/modules/nfs4_acls.c b/source3/modules/nfs4_acls.c
index 349b26b..8756285 100644
--- a/source3/modules/nfs4_acls.c
+++ b/source3/modules/nfs4_acls.c
@@ -274,7 +274,7 @@ static int smbacl4_GetFileOwner(struct connection_struct *conn,
 	ZERO_STRUCTP(psbuf);
 
 	/* Get the stat struct for the owner info. */
-	if (vfs_stat_smb_basename(conn, smb_fname->base_name, psbuf) != 0)
+	if (vfs_stat_smb_basename(conn, smb_fname, psbuf) != 0)
 	{
 		DEBUG(8, ("vfs_stat_smb_basename failed with error %s\n",
 			strerror(errno)));
diff --git a/source3/modules/non_posix_acls.c b/source3/modules/non_posix_acls.c
index fca9979..8d3be72 100644
--- a/source3/modules/non_posix_acls.c
+++ b/source3/modules/non_posix_acls.c
@@ -32,7 +32,7 @@ int non_posix_sys_acl_blob_get_file_helper(vfs_handle_struct *handle,
 	struct xattr_sys_acl_hash_wrapper acl_wrapper = {};
 	struct smb_filename *smb_fname;
 
-	smb_fname = synthetic_smb_fname(frame, path_p, NULL, NULL);
+	smb_fname = synthetic_smb_fname(frame, path_p, NULL, NULL, 0);
 	if (smb_fname == NULL) {
 		TALLOC_FREE(frame);
 		errno = ENOMEM;
diff --git a/source3/modules/vfs_acl_common.c b/source3/modules/vfs_acl_common.c
index d21c167..98e1b8e 100644
--- a/source3/modules/vfs_acl_common.c
+++ b/source3/modules/vfs_acl_common.c
@@ -641,7 +641,7 @@ static NTSTATUS get_nt_acl_internal(vfs_handle_struct *handle,
 			 * is fully plumbed through the VFS.
 			 */
 			int ret = vfs_stat_smb_basename(handle->conn,
-						smb_fname->base_name,
+						smb_fname,
 						&sbuf);
 			if (ret == -1) {
 				TALLOC_FREE(frame);
@@ -1138,7 +1138,7 @@ static int chmod_acl_module_common(struct vfs_handle_struct *handle,
 			const struct smb_filename *smb_fname,
 			mode_t mode)
 {
-	if (lp_posix_pathnames()) {
+	if (smb_fname->flags & SMB_FILENAME_POSIX_PATH) {
 		/* Only allow this on POSIX pathnames. */
 		return SMB_VFS_NEXT_CHMOD(handle, smb_fname, mode);
 	}
@@ -1159,7 +1159,7 @@ static int chmod_acl_acl_module_common(struct vfs_handle_struct *handle,
 			const struct smb_filename *smb_fname,
 			mode_t mode)
 {
-	if (lp_posix_pathnames()) {
+	if (smb_fname->flags & SMB_FILENAME_POSIX_PATH) {
 		/* Only allow this on POSIX pathnames. */
 		return SMB_VFS_NEXT_CHMOD_ACL(handle, smb_fname, mode);
 	}
diff --git a/source3/modules/vfs_acl_tdb.c b/source3/modules/vfs_acl_tdb.c
index 1bc5973..e4c8462 100644
--- a/source3/modules/vfs_acl_tdb.c
+++ b/source3/modules/vfs_acl_tdb.c
@@ -160,7 +160,7 @@ static NTSTATUS get_acl_blob(TALLOC_CTX *ctx,
 		sbuf = fsp->fsp_name->st;
 	} else {
 		int ret = vfs_stat_smb_basename(handle->conn,
-				smb_fname->base_name,
+				smb_fname,
 				&sbuf);
 		if (ret == -1) {
 			status = map_nt_error_from_unix(errno);
@@ -252,7 +252,7 @@ static int unlink_acl_tdb(vfs_handle_struct *handle,
 		goto out;
 	}
 
-	if (lp_posix_pathnames()) {
+	if (smb_fname_tmp->flags & SMB_FILENAME_POSIX_PATH) {
 		ret = SMB_VFS_LSTAT(handle->conn, smb_fname_tmp);
 	} else {
 		ret = SMB_VFS_STAT(handle->conn, smb_fname_tmp);
@@ -285,7 +285,7 @@ static int rmdir_acl_tdb(vfs_handle_struct *handle,
 	struct db_context *db = acl_db;
 	int ret = -1;
 
-	ret = vfs_stat_smb_basename(handle->conn, smb_fname->base_name, &sbuf);
+	ret = vfs_stat_smb_basename(handle->conn, smb_fname, &sbuf);
 	if (ret == -1) {
 		return -1;
 	}
@@ -341,11 +341,13 @@ static int sys_acl_set_file_tdb(vfs_handle_struct *handle,
                               SMB_ACL_TYPE_T type,
                               SMB_ACL_T theacl)
 {
-	SMB_STRUCT_STAT sbuf;
 	struct db_context *db = acl_db;
 	int ret = -1;
+	struct smb_filename smb_fname = {
+		.base_name = discard_const_p(char, path)
+	};
 
-	ret = vfs_stat_smb_basename(handle->conn, path, &sbuf);
+	ret = SMB_VFS_STAT(handle->conn, &smb_fname);
 	if (ret == -1) {
 		return -1;
 	}
@@ -358,7 +360,7 @@ static int sys_acl_set_file_tdb(vfs_handle_struct *handle,
 		return -1;
 	}
 
-	acl_tdb_delete(handle, db, &sbuf);
+	acl_tdb_delete(handle, db, &smb_fname.st);
 	return 0;
 }
 
diff --git a/source3/modules/vfs_afsacl.c b/source3/modules/vfs_afsacl.c
index aa8de9a..5838fd0 100644
--- a/source3/modules/vfs_afsacl.c
+++ b/source3/modules/vfs_afsacl.c
@@ -666,12 +666,14 @@ static size_t afs_to_nt_acl(struct afs_acl *afs_acl,
 {
 	int ret;
 
+	/*
+	 * We can directly use SMB_VFS_STAT here, as if this was a
+	 * POSIX call on a symlink, we've already refused it.
+	 * For a Windows acl mapped call on a symlink, we want to follow
+	 * it.
+	 */
 	/* Get the stat struct for the owner info. */
-	if (lp_posix_pathnames()) {
-		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) {
 		return 0;
 	}
@@ -1031,31 +1033,24 @@ static NTSTATUS afsacl_fget_nt_acl(struct vfs_handle_struct *handle,
 }
 
 static NTSTATUS afsacl_get_nt_acl(struct vfs_handle_struct *handle,
-				  const char *name, uint32_t security_info,
-				  TALLOC_CTX *mem_ctx,
-				  struct security_descriptor **ppdesc)
+				const struct smb_filename *smb_fname,
+				uint32_t security_info,
+				TALLOC_CTX *mem_ctx,
+				struct security_descriptor **ppdesc)
 {
 	struct afs_acl acl;
 	size_t sd_size;
-	struct smb_filename *smb_fname = NULL;
 
-	DEBUG(5, ("afsacl_get_nt_acl: %s\n", name));
+	DEBUG(5, ("afsacl_get_nt_acl: %s\n", smb_fname->base_name));
 
 	sidpts = lp_parm_bool(SNUM(handle->conn), "afsacl", "sidpts", false);
 
-	if (!afs_get_afs_acl(name, &acl)) {
+	if (!afs_get_afs_acl(smb_fname->base_name, &acl)) {
 		return NT_STATUS_ACCESS_DENIED;
 	}
 
-	smb_fname = synthetic_smb_fname(talloc_tos(), name, NULL, NULL);
-	if (smb_fname == NULL) {
-		free_afs_acl(&acl);
-		return NT_STATUS_NO_MEMORY;
-	}
-
 	sd_size = afs_to_nt_acl(&acl, handle->conn, smb_fname, security_info,
 				mem_ctx, ppdesc);
-	TALLOC_FREE(smb_fname);
 
 	free_afs_acl(&acl);
 
diff --git a/source3/modules/vfs_cap.c b/source3/modules/vfs_cap.c
index 42b4b8d..eece198 100644
--- a/source3/modules/vfs_cap.c
+++ b/source3/modules/vfs_cap.c
@@ -69,7 +69,8 @@ static DIR *cap_opendir(vfs_handle_struct *handle,
 	cap_smb_fname = synthetic_smb_fname(talloc_tos(),
 					capname,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (cap_smb_fname == NULL) {
 		TALLOC_FREE(capname);
 		errno = ENOMEM;
@@ -125,7 +126,8 @@ static int cap_mkdir(vfs_handle_struct *handle,
 	cap_smb_fname = synthetic_smb_fname(talloc_tos(),
 					cappath,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (cap_smb_fname == NULL) {
 		TALLOC_FREE(cappath);
 		errno = ENOMEM;
@@ -149,7 +151,8 @@ static int cap_rmdir(vfs_handle_struct *handle,
 	cap_smb_fname = synthetic_smb_fname(talloc_tos(),
 					cappath,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (cap_smb_fname == NULL) {
 		TALLOC_FREE(cappath);
 		errno = ENOMEM;
@@ -321,7 +324,8 @@ static int cap_chmod(vfs_handle_struct *handle,
 	cap_smb_fname = synthetic_smb_fname(talloc_tos(),
 					cappath,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (cap_smb_fname == NULL) {
 		TALLOC_FREE(cappath);
 		errno = ENOMEM;
@@ -354,7 +358,8 @@ static int cap_chown(vfs_handle_struct *handle,
 	cap_smb_fname = synthetic_smb_fname(talloc_tos(),
 					cappath,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (cap_smb_fname == NULL) {
 		TALLOC_FREE(cappath);
 		errno = ENOMEM;
@@ -387,7 +392,8 @@ static int cap_lchown(vfs_handle_struct *handle,
 	cap_smb_fname = synthetic_smb_fname(talloc_tos(),
 					cappath,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (cap_smb_fname == NULL) {
 		TALLOC_FREE(cappath);
 		errno = ENOMEM;
@@ -522,7 +528,8 @@ static int cap_chmod_acl(vfs_handle_struct *handle,
 	cap_smb_fname = synthetic_smb_fname(talloc_tos(),
 					cappath,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (cap_smb_fname == NULL) {
 		TALLOC_FREE(cappath);
 		errno = ENOMEM;
diff --git a/source3/modules/vfs_catia.c b/source3/modules/vfs_catia.c
index e2b4eb5..c5d2b6a 100644
--- a/source3/modules/vfs_catia.c
+++ b/source3/modules/vfs_catia.c
@@ -290,7 +290,8 @@ static DIR *catia_opendir(vfs_handle_struct *handle,
 	mapped_smb_fname = synthetic_smb_fname(talloc_tos(),
 				name_mapped,
 				NULL,
-				NULL);
+				NULL,
+				smb_fname->flags);
 	if (mapped_smb_fname == NULL) {
 		TALLOC_FREE(mapped_smb_fname);
 		errno = ENOMEM;
@@ -543,7 +544,8 @@ static int catia_chown(vfs_handle_struct *handle,
 	catia_smb_fname = synthetic_smb_fname(talloc_tos(),
 					name,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (catia_smb_fname == NULL) {
 		TALLOC_FREE(name);
 		errno = ENOMEM;
@@ -580,7 +582,8 @@ static int catia_lchown(vfs_handle_struct *handle,
 	catia_smb_fname = synthetic_smb_fname(talloc_tos(),
 					name,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (catia_smb_fname == NULL) {
 		TALLOC_FREE(name);
 		errno = ENOMEM;
@@ -616,7 +619,8 @@ static int catia_chmod(vfs_handle_struct *handle,
 	catia_smb_fname = synthetic_smb_fname(talloc_tos(),
 					name,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (catia_smb_fname == NULL) {
 		TALLOC_FREE(name);
 		errno = ENOMEM;
@@ -650,7 +654,8 @@ static int catia_rmdir(vfs_handle_struct *handle,
 	catia_smb_fname = synthetic_smb_fname(talloc_tos(),
 					name,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (catia_smb_fname == NULL) {
 		TALLOC_FREE(name);
 		errno = ENOMEM;
@@ -684,7 +689,8 @@ static int catia_mkdir(vfs_handle_struct *handle,
 	catia_smb_fname = synthetic_smb_fname(talloc_tos(),
 					name,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (catia_smb_fname == NULL) {
 		TALLOC_FREE(name);
 		errno = ENOMEM;
@@ -819,7 +825,8 @@ catia_streaminfo(struct vfs_handle_struct *handle,
 	catia_smb_fname = synthetic_smb_fname(talloc_tos(),
 					mapped_name,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (catia_smb_fname == NULL) {
 		TALLOC_FREE(mapped_name);
 		return NT_STATUS_NO_MEMORY;
@@ -898,7 +905,8 @@ catia_get_nt_acl(struct vfs_handle_struct *handle,
 	mapped_smb_fname = synthetic_smb_fname(talloc_tos(),
 					mapped_name,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (mapped_smb_fname == NULL) {
 		TALLOC_FREE(mapped_name);
 		return NT_STATUS_NO_MEMORY;
@@ -935,7 +943,8 @@ catia_chmod_acl(vfs_handle_struct *handle,
 	mapped_smb_fname = synthetic_smb_fname(talloc_tos(),
 					mapped_name,
 					NULL,
-					NULL);
+					NULL,
+					smb_fname->flags);
 	if (mapped_smb_fname == NULL) {
 		TALLOC_FREE(mapped_name);
 		errno = ENOMEM;
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index ea7dc2c..41e443e 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -133,7 +133,7 @@ static uint32_t vfswrap_fs_capabilities(struct vfs_handle_struct *handle,
 	 * use when setting a timestamp. */
 
 	smb_fname_cpath = synthetic_smb_fname(talloc_tos(), conn->connectpath,
-					      NULL, NULL);
+					      NULL, NULL, 0);
 	if (smb_fname_cpath == NULL) {
 		return caps;
 	}
@@ -419,13 +419,20 @@ static struct dirent *vfswrap_readdir(vfs_handle_struct *handle,
 		if (result != NULL) {
 			/* See if we can efficiently return this. */
 			struct stat st;
-			int flags = (lp_posix_pathnames() ?
-				AT_SYMLINK_NOFOLLOW : 0);
+			int flags = AT_SYMLINK_NOFOLLOW;
 			int ret = fstatat(dirfd(dirp),
 					result->d_name,
 					&st,
 					flags);
-			if (ret == 0) {
+			/*
+			 * As this is an optimization,
+			 * ignore it if we stat'ed a
+			 * symlink. Make the caller
+			 * do it again as we don't
+			 * know if they wanted the link
+			 * info, or its target info.
+			 */
+			if ((ret == 0) && (!S_ISLNK(st.st_mode))) {
 				init_stat_ex_from_stat(sbuf,
 					&st,
 					lp_fake_directory_create_times(
@@ -2211,8 +2218,9 @@ static NTSTATUS vfswrap_streaminfo(vfs_handle_struct *handle,
 		ZERO_STRUCT(smb_fname_cp);
 		smb_fname_cp.base_name = discard_const_p(char,
 					smb_fname->base_name);
+		smb_fname_cp.flags = smb_fname->flags;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list