diff options
author | Jeremy Allison <jra@samba.org> | 2012-09-12 11:39:37 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2012-09-12 22:06:06 +0200 |
commit | b6636affaf4d475487e49ed8d5a31b94b82ae6d0 (patch) | |
tree | 8845f985f34468bf49e77fd800d2b9987c4f8b45 /source3/smbd | |
parent | a8676e69a636648d8a309e8e000dcd62d38bfa06 (diff) | |
download | samba-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.
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/service.c | 6 | ||||
-rw-r--r-- | source3/smbd/vfs.c | 10 |
2 files changed, 15 insertions, 1 deletions
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; } /******************************************************************* |