summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2012-09-12 11:39:37 -0700
committerJeremy Allison <jra@samba.org>2012-09-12 22:06:06 +0200
commitb6636affaf4d475487e49ed8d5a31b94b82ae6d0 (patch)
tree8845f985f34468bf49e77fd800d2b9987c4f8b45
parenta8676e69a636648d8a309e8e000dcd62d38bfa06 (diff)
downloadsamba-b6636affaf4d475487e49ed8d5a31b94b82ae6d0.tar.gz
samba-b6636affaf4d475487e49ed8d5a31b94b82ae6d0.tar.bz2
samba-b6636affaf4d475487e49ed8d5a31b94b82ae6d0.zip
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.
-rw-r--r--source3/include/vfs.h2
-rw-r--r--source3/smbd/service.c6
-rw-r--r--source3/smbd/vfs.c10
3 files changed, 17 insertions, 1 deletions
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index 8e48803fe7..c83e7ed54b 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 0cd48f8950..b2d3d4ddc1 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 3eda2cf97b..7d194404f4 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;
}
/*******************************************************************