On Sat, 30 Jul 2005, Ian Kent wrote:

> On Mon, 18 Jul 2005, Jeff Moyer wrote:
> 
> > Hi, Ian,
> > 
> > A "bug" was introduced into the get_best_mount function at some point.
> > Basically, if is_local_mount returns failure, we should be setting *what to
> > NULL, since this is what the caller checks:
> > 
> >         colon = strchr(whatstr, ':');
> >         if (!colon) {
> >                 /* No colon, take this as a bind (local) entry */
> >                 local = 1;
> >         } else if (!nosymlink) {
> >                 local = get_best_mount(whatstr, what, 0);
> >                 if (!*whatstr) {                <---------------
> >                         warn(MODPREFIX "no host elected");
> >                         return 1;
> >                 }
> >                 debug(MODPREFIX "from %s elected %s", what, whatstr);
> >         }
> > 
> > Prior to the patches in this area of code, we did indeed set *what to NULL
> > before returning in this specific case (the host name resolution failed,
> > and this was the only entry).
> > 
> > The way the code stands, you will end up failing the mount (for the very
> > same reason, the host name lookup will fail).  So, this patch is relatively
> > low on the priority scale.  However, it seems like a correctness issue to
> > me.  Otherwise, we should get rid of the check for *whatstr.
> 
> Looks like this bug it`s a bit worse.
> 
> If we have a replcated mount with two hosts where, say, the first is 
> dowm and the second fails name lookup then we try to mount the first 
> (instead of failing) leading to a hang of a couple of minutes while mount 
> times out.
> 
> > 
> > Let me know what you think.
> 
> Ouch!

I added the hunk at the bottom to the patch.
I haven't had time to test it yet.

Check it out and let me know what you think.
Interestingly, I might have missed this except that I have a dual boot box 
in the a replicated list map and this caused mount to and hang in the case 
described above. Takes about 2 mins to timeout. I was testing something 
else when I stumbled on it.

--- autofs-4.1.4/modules/mount_nfs.c.whatstr    2005-07-30 14:17:40.000000000 
+0800
+++ autofs-4.1.4/modules/mount_nfs.c    2005-07-30 14:24:50.000000000 +0800
@@ -197,12 +197,14 @@ int get_best_mount(char *what, const cha
         *  do anything except strip whitespace from the end of the string.
         */
        if (!is_replicated_entry(p)) {
+               int ret;
                for (pstrip = p+strlen(p) - 1; pstrip >= p; pstrip--) 
                        if (isspace(*pstrip))
                                *pstrip = '\0';
 
                /* Check if the host is the localhost */
-               if (is_local_mount(p) > 0) {
+               ret = is_local_mount(p);
+               if (ret > 0) {
                        debug(MODPREFIX "host %s: is localhost", p);
 
                        /* Strip off hostname and ':' */
@@ -213,7 +215,9 @@ int get_best_mount(char *what, const cha
                                what++;
                        }
                        return 1;
-               }
+               } else if (ret < 0)
+                       *what = '\0';
+
                return 0;
        }
 
@@ -344,8 +348,14 @@ int get_best_mount(char *what, const cha
        }
 
        /* No winner found so return first */
-       if (!winner)
-               winner = what;
+       /* No - this will lead to mount hanging if the first host
+        *      is not available. Since we tried to ping it and
+        *      failed that's likely the case.
+        */
+       if (!winner) {
+               *what = '\0';
+               return 0;
+       }
 
        /*
         * We now have our winner, copy it to the front of the string,

_______________________________________________
autofs mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/autofs

Reply via email to