diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2011-08-29 13:20:22 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2011-08-29 13:43:27 -0400 |
commit | 140468c2968472e871b972e400f58ad659458a2d (patch) | |
tree | bdf3115ab580d78f1e970bb921d02d5c32dfbcf7 | |
parent | 1f1bca1748018e390f46fe4426899cc6f79b82b0 (diff) | |
download | nfs-utils-140468c2968472e871b972e400f58ad659458a2d.tar.gz nfs-utils-140468c2968472e871b972e400f58ad659458a2d.tar.xz nfs-utils-140468c2968472e871b972e400f58ad659458a2d.zip |
exportfs: matchhostname() doesn't handle localhost properly
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>
-rw-r--r-- | utils/exportfs/exportfs.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c index b107c7c..12e8bf1 100644 --- a/utils/exportfs/exportfs.c +++ b/utils/exportfs/exportfs.c @@ -448,6 +448,36 @@ is_hostname(const char *sp) 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) { @@ -464,10 +494,10 @@ matchhostname(const char *hostname1, const char *hostname2) if (!is_hostname(hostname1) || !is_hostname(hostname2)) return 0; - results1 = host_addrinfo(hostname1); + results1 = address_list(hostname1); if (results1 == NULL) goto out; - results2 = host_addrinfo(hostname2); + results2 = address_list(hostname2); if (results2 == NULL) goto out; |