From b6636affaf4d475487e49ed8d5a31b94b82ae6d0 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 12 Sep 2012 11:39:37 -0700 Subject: [PATCH] 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. --- source3/include/vfs.h | 2 ++ source3/smbd/service.c | 6 ++++++ source3/smbd/vfs.c | 10 +++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/source3/include/vfs.h b/source3/include/vfs.h index 8e48803fe7d3..c83e7ed54b8f 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/smbd/service.c b/source3/smbd/service.c index 0cd48f895046..b2d3d4ddc164 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 3eda2cf97be9..7d194404f473 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -799,13 +799,21 @@ const char *vfs_readdirname(connection_struct *conn, void *p, int vfs_ChDir(connection_struct *conn, const char *path) { + int ret; + if (strcsequal(path,".")) { return 0; } DEBUG(4,("vfs_ChDir to %s\n",path)); - return SMB_VFS_CHDIR(conn,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 ret; } /******************************************************************* -- 2.34.1