summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2007-02-07 22:20:31 +0000
committerJeremy Allison <jra@samba.org>2007-02-07 22:20:31 +0000
commite5e5625a00f2d1edc7a0b2968ca275644b382b8c (patch)
tree12200a62f065350758afcc8050666331502a4ba0
parent3b4c6baa87b82a5d998cdf6f32bd806d9c357d7e (diff)
downloadsamba-e5e5625a00f2d1edc7a0b2968ca275644b382b8c.tar.gz
samba-e5e5625a00f2d1edc7a0b2968ca275644b382b8c.tar.xz
samba-e5e5625a00f2d1edc7a0b2968ca275644b382b8c.zip
r21226: Fix bug #4377 (rename of "foo" -> "Foo" fails).
This is actually an interesting case as it exposed bad code in our DFS redirect module (that was where the bug was introduced). Caused by our turning on dfsroot be default. Jeremy.
-rw-r--r--source/smbd/msdfs.c40
1 files changed, 29 insertions, 11 deletions
diff --git a/source/smbd/msdfs.c b/source/smbd/msdfs.c
index e4926d5054d..53e2fe9418d 100644
--- a/source/smbd/msdfs.c
+++ b/source/smbd/msdfs.c
@@ -261,7 +261,7 @@ static BOOL parse_symlink(TALLOC_CTX *ctx, char *buf, struct referral **preflist
talloc CTX can be NULL here if reflistp and refcnt pointers are null.
**********************************************************************/
-BOOL is_msdfs_link(TALLOC_CTX *ctx, connection_struct *conn, char *path,
+BOOL is_msdfs_link(TALLOC_CTX *ctx, connection_struct *conn, const char *path,
struct referral **reflistp, int *refcnt,
SMB_STRUCT_STAT *sbufp)
{
@@ -317,11 +317,15 @@ TALLOC_CTX can be NULL here if struct referral **reflistpp, int *refcntp
are also NULL.
*****************************************************************/
-static BOOL resolve_dfs_path(TALLOC_CTX *ctx, const char *dfspath,
- struct dfs_path *dp,
- connection_struct *conn, BOOL search_flag,
- struct referral **reflistpp, int *refcntp,
- BOOL *self_referralp, int *consumedcntp)
+static BOOL resolve_dfs_path(TALLOC_CTX *ctx,
+ const char *dfspath,
+ struct dfs_path *dp,
+ connection_struct *conn,
+ BOOL search_flag,
+ struct referral **reflistpp,
+ int *refcntp,
+ BOOL *self_referralp,
+ int *consumedcntp)
{
pstring localpath;
int consumed_level = 1;
@@ -349,12 +353,25 @@ static BOOL resolve_dfs_path(TALLOC_CTX *ctx, const char *dfspath,
DEBUG(10,("resolve_dfs_path: Conn path = %s req_path = %s\n", conn->connectpath, dp->reqpath));
- status = unix_convert(conn, dp->reqpath, False, NULL, &sbuf);
- /* Should we terminate on status != NT_STATUS_OK ???? */
+ /*
+ * Note the unix path conversion here we're doing we can
+ * throw away. We're looking for a symlink for a dfs
+ * resolution, if we don't find it we'll do another
+ * unix_convert later in the codepath.
+ * If we needed to remember what we'd resolved in
+ * dp->reqpath (as the original code did) we'd
+ * pstrcpy(localhost, dp->reqpath) on any code
+ * path below that returns True - but I don't
+ * think this is needed. JRA.
+ */
- /* JRA... should we strlower the last component here.... ? */
pstrcpy(localpath, dp->reqpath);
+ status = unix_convert(conn, localpath, False, NULL, &sbuf);
+ if (!NT_STATUS_IS_OK(status)) {
+ return False;
+ }
+
/* check if need to redirect */
if (is_msdfs_link(ctx, conn, localpath, reflistpp, refcntp, NULL)) {
if ( search_flag ) {
@@ -371,7 +388,7 @@ static BOOL resolve_dfs_path(TALLOC_CTX *ctx, const char *dfspath,
}
/* redirect if any component in the path is a link */
- pstrcpy(reqpath, dp->reqpath);
+ pstrcpy(reqpath, localpath);
p = strrchr_m(reqpath, '/');
while (p) {
*p = '\0';
@@ -448,9 +465,10 @@ BOOL dfs_redirect( pstring pathname, connection_struct *conn, BOOL search_wcard_
return True;
} else {
DEBUG(3,("dfs_redirect: Not redirecting %s.\n", pathname));
-
+
/* Form non-dfs tcon-relative path */
pstrcpy(pathname, dp.reqpath);
+
DEBUG(3,("dfs_redirect: Path converted to non-dfs path %s\n", pathname));
return False;
}