]> git.decadent.org.uk Git - nfs-utils.git/commitdiff
exportfs: matchhostname() doesn't handle localhost properly
authorChuck Lever <chuck.lever@oracle.com>
Mon, 29 Aug 2011 17:20:22 +0000 (13:20 -0400)
committerSteve Dickson <steved@redhat.com>
Mon, 29 Aug 2011 17:43:27 +0000 (13:43 -0400)
Same change as statd_matchhostname() is necessary for the logic in
exportfs.

Recall that these are "separate but nearly equal" because the exportfs
version requires extra expensive string checking that would be onerous
for statd.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
utils/exportfs/exportfs.c

index b107c7c9e0d856c1f3678cf4faa70879ce79929f..12e8bf112dd414259ffec3d749497125c5c469b2 100644 (file)
@@ -448,6 +448,36 @@ is_hostname(const char *sp)
        return true;
 }
 
        return true;
 }
 
+/*
+ * Take care to perform an explicit reverse lookup on presentation
+ * addresses.  Otherwise we don't get a real canonical name or a
+ * complete list of addresses.
+ */
+static struct addrinfo *
+address_list(const char *hostname)
+{
+       struct addrinfo *ai;
+       char *cname;
+
+       ai = host_pton(hostname);
+       if (ai != NULL) {
+               /* @hostname was a presentation address */
+               cname = host_canonname(ai->ai_addr);
+               freeaddrinfo(ai);
+               if (cname != NULL)
+                       goto out;
+       }
+       /* @hostname was a hostname or had no reverse mapping */
+       cname = strdup(hostname);
+       if (cname == NULL)
+               return NULL;
+
+out:
+       ai = host_addrinfo(cname);
+       free(cname);
+       return ai;
+}
+
 static int
 matchhostname(const char *hostname1, const char *hostname2)
 {
 static int
 matchhostname(const char *hostname1, const char *hostname2)
 {
@@ -464,10 +494,10 @@ matchhostname(const char *hostname1, const char *hostname2)
        if (!is_hostname(hostname1) || !is_hostname(hostname2))
                return 0;
 
        if (!is_hostname(hostname1) || !is_hostname(hostname2))
                return 0;
 
-       results1 = host_addrinfo(hostname1);
+       results1 = address_list(hostname1);
        if (results1 == NULL)
                goto out;
        if (results1 == NULL)
                goto out;
-       results2 = host_addrinfo(hostname2);
+       results2 = address_list(hostname2);
        if (results2 == NULL)
                goto out;
 
        if (results2 == NULL)
                goto out;