X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=support%2Fexport%2Fclient.c;h=21001ce282dd85ecbe038fa0d53b98ac5e55a043;hb=26fd34002585e6a5aa09204b0b01d836fa83dcf3;hp=dc0106767a4d5cc64eaa424cba80f71d461c2589;hpb=22d6566d473f71e241c791a02435d414648c99e8;p=nfs-utils.git diff --git a/support/export/client.c b/support/export/client.c index dc01067..21001ce 100644 --- a/support/export/client.c +++ b/support/export/client.c @@ -490,43 +490,65 @@ static int check_netgroup(const nfs_client *clp, const struct addrinfo *ai) { const char *netgroup = clp->m_hostname + 1; - const char *hname = ai->ai_canonname; struct addrinfo *tmp = NULL; struct hostent *hp; + char *dot, *hname; int i, match; - char *dot; + + match = 0; + + hname = strdup(ai->ai_canonname); + if (hname == NULL) { + xlog(D_GENERAL, "%s: no memory for strdup", __func__); + goto out; + } /* First, try to match the hostname without * splitting off the domain */ - if (innetgr(netgroup, hname, NULL, NULL)) - return 1; + if (innetgr(netgroup, hname, NULL, NULL)) { + match = 1; + goto out; + } /* See if hname aliases listed in /etc/hosts or nis[+] * match the requested netgroup */ hp = gethostbyname(hname); if (hp != NULL) { for (i = 0; hp->h_aliases[i]; i++) - if (innetgr(netgroup, hp->h_aliases[i], NULL, NULL)) - return 1; + if (innetgr(netgroup, hp->h_aliases[i], NULL, NULL)) { + match = 1; + goto out; + } } - /* If hname is ip address convert to FQDN */ + /* If hname happens to be an IP address, convert it + * to a the canonical DNS name bound to this address. */ tmp = host_pton(hname); if (tmp != NULL) { + char *cname = host_canonname(tmp->ai_addr); freeaddrinfo(tmp); - if (innetgr(netgroup, hname, NULL, NULL)) - return 1; + + /* The resulting FQDN may be in our netgroup. */ + if (cname != NULL) { + free(hname); + hname = cname; + if (innetgr(netgroup, hname, NULL, NULL)) { + match = 1; + goto out; + } + } } /* Okay, strip off the domain (if we have one) */ dot = strchr(hname, '.'); if (dot == NULL) - return 0; + goto out; *dot = '\0'; match = innetgr(netgroup, hname, NULL, NULL); - *dot = '.'; +out: + free(hname); return match; } #else /* !HAVE_INNETGR */