directory recursion problem

Shirish Kalele kalele at veritas.com
Tue Apr 22 00:10:25 GMT 2003


Don't know what I was thinking. Since we need to track down the consumed
path only in certain cases, and only if a link is found, it makes sense to
figure it out in one shot at the very end. So, I'm reverting the whole fix
back to the way it was when you first posted it. Here's the fix I'm going
to apply. Could you let me know if this is okay?

Thanks,
Shirish

Index: msdfs/msdfs.c
===================================================================
RCS file: /data/cvs/samba/source/msdfs/msdfs.c,v
retrieving revision 1.10.4.30
diff -u -r1.10.4.30 msdfs.c
--- msdfs/msdfs.c	24 Feb 2003 19:35:31 -0000	1.10.4.30
+++ msdfs/msdfs.c	22 Apr 2003 00:04:08 -0000
@@ -215,7 +215,7 @@
 		      BOOL* self_referralp, int* consumedcntp)
 {
 	fstring localpath;
-
+	int consumed_level = 1;
 	char *p;
 	fstring reqpath;

@@ -250,10 +250,10 @@
 		}
 	}

-	/* also redirect if the parent directory is a dfs link */
+	/* 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, "/");
@@ -271,15 +271,18 @@
 				pstring buf;
 				pstrcpy(buf, dfspath);
 				trim_string(buf, NULL, "\\");
-				q = strrchr(buf, '\\');
-				if (q)
-					*q = '\0';
+				for (;consumed_level; consumed_level--) {
+					q = strrchr(buf, '\\');
+					if (q) *q = 0;
+				}
 				*consumedcntp = strlen(buf);
-				DEBUG(10, ("resolve_dfs_path: Path consumed: %d\n", *consumedcntp));
+				DEBUG(10, ("resolve_dfs_path: Path consumed: %s (%d)\n", buf, *consumedcntp));
 			}

 			return True;
 		}
+		p = strrchr(reqpath, '/');
+		consumed_level++;
 	}

 	return False;
@@ -606,8 +609,7 @@
 	/* 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);

On Mon, 21 Apr 2003, John P Janosik wrote:

>
>
>
>
>Shirish -
>
>I tested your patch today and found it is not keeping track of the path
>consumed, so deep referral requests still fail.  Here is the patch I am
>using now that works:
>
>[root at rchsker msdfs]# diff -u msdfs.c.orig msdfs.c
>--- msdfs.c.orig        Fri Feb 28 09:56:19 2003
>+++ msdfs.c     Mon Apr 21 17:28:27 2003
>@@ -216,8 +216,9 @@
> {
>        fstring localpath;
>
>-       char *p;
>+       char *p, *q;
>        fstring reqpath;
>+       pstring consumedbuf;
>
>        if (!dp || !conn) {
>                DEBUG(1,("resolve_dfs_path: NULL dfs_path* or NULL
>connection_struct*!\n"));
>@@ -250,14 +251,20 @@
>                }
>        }
>
>-       /* 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) {
>+       q = strrchr(consumedbuf, '\\');
>+       while (p) {
>                *p = '\0';
>+               *q = '\0';
>                fstrcpy(localpath, conn->connectpath);
>                fstrcat(localpath, "/");
>                fstrcat(localpath, reqpath);
>+               DEBUG(3, ("localpath is now %s\n", localpath));
>                if (is_msdfs_link(conn, localpath, reflistpp, refcntp,
>NULL)) {
>                        DEBUG(4, ("resolve_dfs_path: Redirecting %s because
>parent %s is dfs link\n", dfspath, localpath));
>
>@@ -267,19 +274,14 @@
>                           the path consumed
>                        */
>                        if (consumedcntp) {
>-                               char *q;
>-                               pstring buf;
>-                               pstrcpy(buf, dfspath);
>-                               trim_string(buf, NULL, "\\");
>-                               q = strrchr(buf, '\\');
>-                               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, '/');
>+               q = strrchr(consumedbuf, '\\');
>        }
>
>        return False;
>@@ -606,8 +608,7 @@
>        /* 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);
>
>
>Thanks,
>
>John Janosik
>
>
>
>
>                      Shirish Kalele
>                      <kalele at veritas.c        To:       John P Janosik/Rochester/IBM at IBMUS
>                      om>                      cc:       Robin.SOPER at tfeeuk.co.uk, <samba-technical at lists.samba.org>
>                                               Subject:  Re: directory recursion problem
>                      04/10/2003 02:44
>                      PM
>
>
>
>
>
>
>John,
>
>You're right. It seems the behaviour Robin is seeing is because the
>redirector directly makes deep referral requests when its cached referral
>expires. Since your patch fixes deep referrals, it should also fix Robin's
>problem.
>
>I'm going to apply this slightly optimized form of your patch to 2.2, 3.0
>and HEAD. This should fix both problems.
>
>Thanks,
>Shirish
>
>Index: msdfs/msdfs.c
>===================================================================
>RCS file: /data/cvs/samba/source/msdfs/msdfs.c,v
>retrieving revision 1.10.4.30
>diff -u -r1.10.4.30 msdfs.c
>--- msdfs/msdfs.c        24 Feb 2003 19:35:31 -0000          1.10.4.30
>+++ msdfs/msdfs.c        10 Apr 2003 19:34:10 -0000
>@@ -218,6 +218,7 @@
>
>             char *p;
>             fstring reqpath;
>+            pstring consumedbuf;
>
>             if (!dp || !conn) {
>                         DEBUG(1,("resolve_dfs_path: NULL dfs_path* or NULL
>connection_struct*!\n"));
>@@ -250,10 +251,13 @@
>                         }
>             }
>
>-            /* 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, "/");
>@@ -268,18 +272,16 @@
>                                     */
>                                     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;
>@@ -606,8 +608,7 @@
>             /* 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);
>
>
>
>On Thu, 10 Apr 2003, John P Janosik wrote:
>
>>
>>
>>
>>
>>Shirish -
>>
>>I agree that Robin's problem is different than the one I posted.  We were
>>seeing both problems last summer but after I applied the patch the problem
>>Robin reported went away on our clients(both Win2k and XP).  I never took
>>the time to look into the cause of the directory recursion problem because
>>it went away.
>>
>>Thanks,
>>
>>John Janosik
>>
>>
>>
>>
>>                      "Shirish Kalele"
>>                      <kalele at veritas.c        To:
><Robin.SOPER at tfeeuk.co.uk>, John P Janosik/Rochester/IBM at IBMUS
>>                      om>                      cc:
><samba-technical at lists.samba.org>
>>                                               Subject:  Re: directory
>recursion problem
>>                      04/10/2003 12:58
>>                      PM
>>
>>
>>
>>
>>
>>
>>John,
>>
>>Apologies for not getting back to you on this, but at the time, I thought
>>this was an expensive way to fix what seemed like a corner case and was
>>wondering how it could be fixed better. And it must have slipped through.
>>I'll make sure to fix it in cvs this time.
>>
>>I don't think Robin's problem is the same as yours. The last time I'd
>>investigated the directory recursion problem he reports, afaicr, I could
>>reproduce it with a Windows 2000 based DFS as well, and I concluded the
>>problem actually is with the client (probably the Explorer.exe program).
>>I'll try and confirm this.
>>
>>- Shirish
>>
>>----- Original Message -----
>>From: "John P Janosik" <jpjanosi at us.ibm.com>
>>To: <Robin.SOPER at tfeeuk.co.uk>
>>Cc: <samba-technical at lists.samba.org>
>>Sent: Thursday, April 10, 2003 9:47 AM
>>Subject: Re: directory recursion problem
>>
>>
>>>
>>>
>>>
>>>
>>> Robin -
>>>
>>> We were having the same problem along with a problem running binaries
>via
>>a
>>> UNC instead of a mapped drive if the binaries were more than two levels
>>> down a tree when the first level was a DFS referral.  I made the
>>following
>>> patch to Samba to fix the second problem, but we never saw the directory
>>> recursion problem again after this.  Shirish Kalele said he would take a
>>> look at applying the patch or something similar, but I never heard back
>>and
>>> never saw the patch get applied.  Here is a link to my post about the
>>> problem:
>>> http://lists.samba.org/pipermail/samba-technical/2002-August/038903.html
>.
>>>
>>> [rchfs2:root samba-2.2.5]# diff -urN
>>> source/msdfs/msdfs.c.origsource/msdfs/msdfs.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:
>>Pathconsumed:
>>> %d\n", *consumedcntp));
>>>                         }
>>>                         return True;
>>> -               }
>>> +              }
>>> +              p = strrchr(reqpath, '/');
>>>         }
>>>         return False;
>>>
>>>
>>> Date: Thu, 10 Apr 2003 09:52:22 +0100
>>> From: Robin.SOPER at tfeeuk.co.uk
>>> To: samba-technical at samba.org
>>> Subject: directory recursion problem
>>> Message-ID:
><OF902C93F9.3D996294-ON80256D04.0030B9D0 at uk.ad.ep.corp.local>
>>> Content-Type: text/plain; charset="us-ascii"
>>> MIME-Version: 1.0
>>> Precedence: list
>>> Message: 29
>>>
>>> Hi,
>>>
>>> Hopefully you can help me with this one.  I am using Samba 2.2.6 on two
>>> Solaris servers . The PC users all see all the shares as being on one
>>> system and it implements MSDFS to redirect any shares that are
>physically
>>> located on another system to the samba server on that system.  We have
>>> been using this config successfully for a good while now, but recently
>>> it's been getting more and more use and we are experiencing an
>>> intermittent problem - sometimes when the users look in a directory
>>> (windows explorer) they see a directory within it with the same, when
>>they
>>> open that they see a directory within it with the same name etc etc.
>i.e.
>>> a kind of recursive directory thing. Meanwhile other users will be using
>>> the samba shares with no problem. Restarting the PC seems to fix the
>>> problem - which maybe seems to suggest it's client related?   However I
>>am
>>> uncertain whether the problem lies with the WindowsNT4 clients (having a
>>> problem with DFS maybe) or with the samba server .
>>>
>>> Can you advise/help?
>>>
>>> Thanks in advance
>>>
>>>
>>> Robin Soper
>>> TotalFinaElf Exploration UK PLC
>>> Crawpeel Road,  Altens,
>>> Aberdeen
>>> AB12 3FG
>>>
>>> Tel (01224) 297290
>>>
>>>
>>> John Janosik
>>>
>>
>>
>>
>
>
>



More information about the samba-technical mailing list