summaryrefslogtreecommitdiffstats
path: root/source/msdfs
diff options
context:
space:
mode:
authorShirish Kalele <kalele@samba.org>2003-04-10 19:54:17 +0000
committerShirish Kalele <kalele@samba.org>2003-04-10 19:54:17 +0000
commit2c4e59cf26b7169fda824ca86e437a99a02345d2 (patch)
treed326348b28f15a93dd5829e914048289055f5eed /source/msdfs
parent9e6e6c3f50844cf4322d6dd193c4e24b76bae9ba (diff)
downloadsamba-2c4e59cf26b7169fda824ca86e437a99a02345d2.tar.gz
samba-2c4e59cf26b7169fda824ca86e437a99a02345d2.tar.xz
samba-2c4e59cf26b7169fda824ca86e437a99a02345d2.zip
Handle deep referrals: check whether each component in the requested path of
a dfs referral is a dfs link, and redirect. Thanks to John Janosik <jpjanosi@us.ibm.com> for the patch.
Diffstat (limited to 'source/msdfs')
-rw-r--r--source/msdfs/msdfs.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/source/msdfs/msdfs.c b/source/msdfs/msdfs.c
index bf3b3cc2130..fa6617cb52c 100644
--- a/source/msdfs/msdfs.c
+++ b/source/msdfs/msdfs.c
@@ -215,6 +215,7 @@ static BOOL resolve_dfs_path(char* dfspath, struct dfs_path* dp,
char *p;
fstring reqpath;
+ pstring consumedbuf;
if (!dp || !conn) {
DEBUG(1,("resolve_dfs_path: NULL dfs_path* or NULL connection_struct*!\n"));
@@ -247,10 +248,13 @@ static BOOL resolve_dfs_path(char* dfspath, struct dfs_path* dp,
}
}
- /* also redirect if the parent directory is a dfs link */
+ pstrcpy(consumedbuf, dfspath);
+ trim_string(consumedbuf, NULL, "\\");
+
+ /* redirect if any component in the path is a link */
fstrcpy(reqpath, dp->reqpath);
p = strrchr(reqpath, '/');
- if (p) {
+ while (p) {
*p = '\0';
fstrcpy(localpath, conn->connectpath);
fstrcat(localpath, "/");
@@ -265,18 +269,16 @@ static BOOL resolve_dfs_path(char* dfspath, struct dfs_path* dp,
*/
if (consumedcntp) {
char *q;
- pstring buf;
- pstrcpy(buf, dfspath);
- trim_string(buf, NULL, "\\");
- q = strrchr(buf, '\\');
+ q = strrchr(consumedbuf, '\\');
if (q)
*q = '\0';
- *consumedcntp = strlen(buf);
+ *consumedcntp = strlen(consumedbuf);
DEBUG(10, ("resolve_dfs_path: Path consumed: %d\n", *consumedcntp));
}
return True;
}
+ p = strrchr(reqpath, '/');
}
return False;
@@ -629,8 +631,7 @@ int setup_dfs_referral(char* pathname, int max_referral_level, char** ppdata)
/* Trim pathname sent by client so it begins with only one backslash.
Two backslashes confuse some dfs clients
*/
- while (strlen(pathnamep) > 1 && pathnamep[0] == '\\'
- && pathnamep[1] == '\\')
+ while (pathnamep[0] == '\\' && pathnamep[1] == '\\')
pathnamep++;
pstrcpy(buf, pathnamep);