[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Wed Sep 12 15:46:02 MDT 2012


The branch, master has been updated
       via  f5a2379 In vfs modules, don't use 'conn->origpath' when we really mean 'conn->cwd'.
       via  b6636af Move cached cwd onto conn struct.
       via  a8676e6 Remove ancient "optimization" global LastDir.
      from  893b213 Avoid overriding default ccache for ads operations.

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


- Log -----------------------------------------------------------------
commit f5a23797949334b3b37a40b8308e0db7ddff9bda
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Sep 12 11:42:57 2012 -0700

    In vfs modules, don't use 'conn->origpath' when we really mean 'conn->cwd'.
    
    This allows VFS modules to work even when we've changed directory
    under the connect path in order to do root-safe calls.
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Wed Sep 12 23:45:23 CEST 2012 on sn-devel-104

commit b6636affaf4d475487e49ed8d5a31b94b82ae6d0
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Sep 12 11:39:37 2012 -0700

    Move cached cwd onto conn struct.
    
    This enables us to make VFS modules safe for use in root called
    code when we've changed directory under conn->connectpath.

commit a8676e69a636648d8a309e8e000dcd62d38bfa06
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Sep 12 11:21:01 2012 -0700

    Remove ancient "optimization" global LastDir.

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

Summary of changes:
 source3/include/vfs.h                      |    2 ++
 source3/modules/vfs_netatalk.c             |   14 +++++++-------
 source3/modules/vfs_preopen.c              |    2 +-
 source3/modules/vfs_smb_traffic_analyzer.c |    2 +-
 source3/modules/vfs_streams_depot.c        |    2 +-
 source3/smbd/globals.c                     |    1 -
 source3/smbd/globals.h                     |    1 -
 source3/smbd/service.c                     |    6 ++++++
 source3/smbd/vfs.c                         |   23 +++++++++--------------
 9 files changed, 27 insertions(+), 26 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index 8e48803..c83e7ed 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -145,6 +145,7 @@
 /* Leave at 29 - not yet released. Add durable handle functions - metze/obnox */
 /* Leave at 29 - not yet released. Added sys_acl_blob_get_file and sys_acl_blob_get_fd */
 /* Bump to version 30 - Samba 4.0.0 will ship with interface version 30 */
+/* Leave at 30 - not yet released. Added conn->cwd to save vfs_GetWd() calls. */
 #define SMB_VFS_INTERFACE_VERSION 30
 
 /*
@@ -315,6 +316,7 @@ typedef struct connection_struct {
 	enum timestamp_set_resolution ts_res;
 	char *connectpath;
 	char *origpath;
+	char *cwd; /* Working directory. */
 
 	struct vfs_handle_struct *vfs_handles;		/* for the new plugins */
 
diff --git a/source3/modules/vfs_netatalk.c b/source3/modules/vfs_netatalk.c
index a457355..ff16ae3 100644
--- a/source3/modules/vfs_netatalk.c
+++ b/source3/modules/vfs_netatalk.c
@@ -229,7 +229,7 @@ static int atalk_rmdir(struct vfs_handle_struct *handle, const char *path)
 	TALLOC_CTX *ctx = 0;
 	char *dpath;
 
-	if (!handle->conn->origpath || !path) goto exit_rmdir;
+	if (!handle->conn->cwd || !path) goto exit_rmdir;
 
 	/* due to there is no way to change bDeleteVetoFiles variable
 	 * from this module, gotta use talloc stuff..
@@ -241,7 +241,7 @@ static int atalk_rmdir(struct vfs_handle_struct *handle, const char *path)
 		goto exit_rmdir;
 
 	if (!(dpath = talloc_asprintf(ctx, "%s/%s%s", 
-	  handle->conn->origpath, path, add ? "/"APPLEDOUBLE : "")))
+	  handle->conn->cwd, path, add ? "/"APPLEDOUBLE : "")))
 		goto exit_rmdir;
 
 	atalk_rrmdir(ctx, dpath);
@@ -272,7 +272,7 @@ static int atalk_rename(struct vfs_handle_struct *handle,
 		return ret;
 	}
 
-	if (atalk_build_paths(talloc_tos(), handle->conn->origpath, oldname,
+	if (atalk_build_paths(talloc_tos(), handle->conn->cwd, oldname,
 			      &adbl_path, &orig_path, &adbl_info,
 			      &orig_info) != 0)
 		goto exit_rename;
@@ -333,7 +333,7 @@ static int atalk_unlink(struct vfs_handle_struct *handle,
 		}
 	}
 
-	if (atalk_build_paths(talloc_tos(), handle->conn->origpath, path,
+	if (atalk_build_paths(talloc_tos(), handle->conn->cwd, path,
 			      &adbl_path, &orig_path,
 			      &adbl_info, &orig_info) != 0)
 		goto exit_unlink;
@@ -368,7 +368,7 @@ static int atalk_chmod(struct vfs_handle_struct *handle, const char *path, mode_
 	if (!(ctx = talloc_init("chmod_file")))
 		return ret;
 
-	if (atalk_build_paths(ctx, handle->conn->origpath, path, &adbl_path,
+	if (atalk_build_paths(ctx, handle->conn->cwd, path, &adbl_path,
 			      &orig_path, &adbl_info, &orig_info) != 0)
 		goto exit_chmod;
 
@@ -400,7 +400,7 @@ static int atalk_chown(struct vfs_handle_struct *handle, const char *path, uid_t
 	if (!(ctx = talloc_init("chown_file")))
 		return ret;
 
-	if (atalk_build_paths(ctx, handle->conn->origpath, path,
+	if (atalk_build_paths(ctx, handle->conn->cwd, path,
 			      &adbl_path, &orig_path,
 			      &adbl_info, &orig_info) != 0)
 		goto exit_chown;
@@ -435,7 +435,7 @@ static int atalk_lchown(struct vfs_handle_struct *handle, const char *path, uid_
 	if (!(ctx = talloc_init("lchown_file")))
 		return ret;
 
-	if (atalk_build_paths(ctx, handle->conn->origpath, path,
+	if (atalk_build_paths(ctx, handle->conn->cwd, path,
 			      &adbl_path, &orig_path,
 			      &adbl_info, &orig_info) != 0)
 		goto exit_lchown;
diff --git a/source3/modules/vfs_preopen.c b/source3/modules/vfs_preopen.c
index 3540d34..108ca29 100644
--- a/source3/modules/vfs_preopen.c
+++ b/source3/modules/vfs_preopen.c
@@ -405,7 +405,7 @@ static int preopen_open(vfs_handle_struct *handle,
 
 	TALLOC_FREE(state->template_fname);
 	state->template_fname = talloc_asprintf(
-		state, "%s/%s", fsp->conn->connectpath, smb_fname->base_name);
+		state, "%s/%s", fsp->conn->cwd, smb_fname->base_name);
 
 	if (state->template_fname == NULL) {
 		return res;
diff --git a/source3/modules/vfs_smb_traffic_analyzer.c b/source3/modules/vfs_smb_traffic_analyzer.c
index c728e7d..9151bfb 100644
--- a/source3/modules/vfs_smb_traffic_analyzer.c
+++ b/source3/modules/vfs_smb_traffic_analyzer.c
@@ -491,7 +491,7 @@ static void smb_traffic_analyzer_send_data(vfs_handle_struct *handle,
 			username,
 			handle->conn->session_info->info->domain_name,
 			Write ? 'W' : 'R',
-			handle->conn->connectpath,
+			handle->conn->cwd,
 			s_data->filename,
 			tm->tm_year+1900,
 			tm->tm_mon+1,
diff --git a/source3/modules/vfs_streams_depot.c b/source3/modules/vfs_streams_depot.c
index a3ce8c1..c0d5945 100644
--- a/source3/modules/vfs_streams_depot.c
+++ b/source3/modules/vfs_streams_depot.c
@@ -129,7 +129,7 @@ static char *stream_dir(vfs_handle_struct *handle,
 	check_valid = lp_parm_bool(SNUM(handle->conn),
 		      "streams_depot", "check_valid", true);
 
-	tmp = talloc_asprintf(talloc_tos(), "%s/.streams", handle->conn->connectpath);
+	tmp = talloc_asprintf(talloc_tos(), "%s/.streams", handle->conn->cwd);
 
 	if (tmp == NULL) {
 		errno = ENOMEM;
diff --git a/source3/smbd/globals.c b/source3/smbd/globals.c
index 80f6a66..874f35d 100644
--- a/source3/smbd/globals.c
+++ b/source3/smbd/globals.c
@@ -85,7 +85,6 @@ int conn_ctx_stack_ndx = 0;
 
 struct vfs_init_function_entry *backends = NULL;
 char *sparse_buf = NULL;
-char *LastDir = NULL;
 
 struct smbd_parent_context *am_parent = NULL;
 struct memcache *smbd_memcache_ctx = NULL;
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index 566f04d..1cefe51 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -101,7 +101,6 @@ extern int conn_ctx_stack_ndx;
 struct vfs_init_function_entry;
 extern struct vfs_init_function_entry *backends;
 extern char *sparse_buf;
-extern char *LastDir;
 
 struct smbd_parent_context;
 extern struct smbd_parent_context *am_parent;
diff --git a/source3/smbd/service.c b/source3/smbd/service.c
index 0cd48f8..b2d3d4d 100644
--- a/source3/smbd/service.c
+++ b/source3/smbd/service.c
@@ -164,6 +164,12 @@ bool set_conn_connectpath(connection_struct *conn, const char *connectpath)
 
 	talloc_free(conn->connectpath);
 	conn->connectpath = destname;
+	/* Ensure conn->cwd is initialized - start as conn->connectpath. */
+	TALLOC_FREE(conn->cwd);
+	conn->cwd = talloc_strdup(conn, conn->connectpath);
+	if (!conn->cwd) {
+		return false;
+	}
 	return true;
 }
 
diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c
index 763ef37..7d19440 100644
--- a/source3/smbd/vfs.c
+++ b/source3/smbd/vfs.c
@@ -799,26 +799,21 @@ const char *vfs_readdirname(connection_struct *conn, void *p,
 
 int vfs_ChDir(connection_struct *conn, const char *path)
 {
-	int res;
+	int ret;
 
-	if (!LastDir) {
-		LastDir = SMB_STRDUP("");
+	if (strcsequal(path,".")) {
+		return 0;
 	}
 
-	if (strcsequal(path,"."))
-		return(0);
-
-	if (*path == '/' && strcsequal(LastDir,path))
-		return(0);
-
 	DEBUG(4,("vfs_ChDir to %s\n",path));
 
-	res = SMB_VFS_CHDIR(conn,path);
-	if (!res) {
-		SAFE_FREE(LastDir);
-		LastDir = SMB_STRDUP(path);
+	ret = SMB_VFS_CHDIR(conn,path);
+	if (ret == 0) {
+		TALLOC_FREE(conn->cwd);
+		conn->cwd = vfs_GetWd(conn, conn);
+		DEBUG(4,("vfs_ChDir got %s\n",conn->cwd));
 	}
-	return(res);
+	return ret;
 }
 
 /*******************************************************************


-- 
Samba Shared Repository


More information about the samba-cvs mailing list