Problem with msdfs with Samba 2.2.5 and 3.0 alpha19
John P Janosik
jpjanosi at us.ibm.com
Wed Aug 21 06:35:01 GMT 2002
Hello,
I think we have found a problem with Samba's msdfs support. When we try to
directly access a directory for the first time via a msdfs link from a
Windows XP or 2000 client the Samba server does not return the referral if
the link is more than two levels back in the path. Here is an example:
Win2000 server with a Dfs root \\rchn20dc\home, link technet points to a
Samba server:
C:\>dir \\rchn20dc\home\technet\tn0208\technet
Volume in drive \\rchn20dc\home has no label.
Volume Serial Number is 5406-067F
Directory of \\rchn20dc\home\technet\tn0208\technet
08/06/2002 02:37 PM <DIR> .
.
.
07/31/2002 07:00 PM 11,291,797 TN0208.TOC
5 File(s) 643,464,418 bytes
2 Dir(s) 233,144,582,144 bytes free
Samba 2.2.5 or 3.0 alpha19 msdfs root with same link:
C:\>dir \\rchfs\pub\technet\tn0208\technet
Volume in drive \\rchfs\pub is pub
Volume Serial Number is 0514-0112
Directory of \\rchfs\pub\technet\tn0208
08/06/2002 02:34 PM <DIR> .
.
.
08/06/2002 02:37 PM <DIR> TECHNET
20 File(s) 6,407,854 bytes
4 Dir(s) 233,144,582,144 bytes free
After looking at the ethereal traces to a Samba 2.2.5, Samba 3.0 alpha19,
and Win2k server I see that Win2k returns the referral for \\rcn20dc\pub
when sent a get_dfs_referral for \rchn20dc\home\technet\tn0208\technet.
The Samba servers do not. The XP client then sends a second
get_dfs_referral to the Samba server, this time leaving off the last
directory in the path and then displays the directory one level back from
what was asked for. I have tried the same test from a Windows 2000 client
and the dir command to the Samba server just fails, it does not send the
second get_dfs_referral.
I made the following change to work around the problem. Can anyone tell
me if this is OK:
[rchfs2:root samba-2.2.5]# diff -urN source/msdfs/msdfs.c.orig
source/msdfs/msdf
s.c
--- source/msdfs/msdfs.c.orig Tue Jun 18 20:13:44 2002
+++ source/msdfs/msdfs.c Wed Aug 21 10:20:20 2002
@@ -215,7 +215,7 @@
BOOL* self_referralp, int* consumedcntp)
{
fstring localpath;
-
+ int levels;
char *p;
fstring reqpath;
@@ -253,7 +253,7 @@
/* also redirect if the parent directory is a dfs link */
fstrcpy(reqpath, dp->reqpath);
p = strrchr(reqpath, '/');
- if (p) {
+ for(levels=1; p; levels++) {
*p = '\0';
fstrcpy(localpath, conn->connectpath);
fstrcat(localpath, "/");
@@ -267,19 +267,23 @@
the path consumed
*/
if (consumedcntp) {
- char *q;
- pstring buf;
+ char *q;
+ pstring buf;
+ int j;
safe_strcpy(buf, dfspath, sizeof(buf));
trim_string(buf, NULL, "\\");
- q = strrchr(buf, '\\');
- if (q)
- *q = '\0';
+ for(j=0; j<levels; j++) {
+ q = strrchr(buf, '\\');
+ if (q)
+ *q = '\0';
+ }
*consumedcntp = strlen(buf);
DEBUG(10, ("resolve_dfs_path: Path
consumed: %d\
n", *consumedcntp));
}
return True;
- }
+ }
+ p = strrchr(reqpath, '/');
}
return False;
Thanks,
John Janosik
jpjanosi at us.ibm.com
More information about the samba-technical
mailing list