From: J. Bruce Fields Date: Thu, 3 May 2012 18:59:27 +0000 (-0400) Subject: mountd: parse ip address earlier X-Git-Tag: nfs-utils-1-2-6-rc7~3 X-Git-Url: https://git.decadent.org.uk/gitweb/?a=commitdiff_plain;h=005c49a063544b4005b5b7c3c28ed48c197f66ac;p=nfs-utils.git mountd: parse ip address earlier I don't see the point of waiting to the last minute to parse the ip address. If the client name isn't a legal ip address then this will fail fairly quickly, so there's not much of a performance penalty. Also, note the previous code incorrectly assumed client_resolve would always return non-NULL. Also factor out some common code. Signed-off-by: J. Bruce Fields Signed-off-by: Steve Dickson --- diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c index 47c8691..c5f8093 100644 --- a/utils/mountd/cache.c +++ b/utils/mountd/cache.c @@ -495,6 +495,19 @@ static bool match_fsid(struct parsed_fsid *parsed, nfs_export *exp, char *path) return false; } +struct addrinfo *lookup_client_addr(char *dom) +{ + struct addrinfo *ret; + struct addrinfo *tmp; + + tmp = host_pton(dom); + if (tmp == NULL) + return NULL; + ret = client_resolve(tmp->ai_addr); + freeaddrinfo(tmp); + return ret; +} + static void nfsd_fh(FILE *f) { /* request are: @@ -538,6 +551,12 @@ static void nfsd_fh(FILE *f) auth_reload(); + if (use_ipaddr) { + ai = lookup_client_addr(dom); + if (!ai) + goto out; + } + /* Now determine export point for this fsid/domain */ for (i=0 ; i < MCL_MAXTYPES; i++) { nfs_export *next_exp; @@ -578,18 +597,8 @@ static void nfsd_fh(FILE *f) if (!match_fsid(&parsed, exp, path)) continue; - if (use_ipaddr) { - if (ai == NULL) { - struct addrinfo *tmp; - tmp = host_pton(dom); - if (tmp == NULL) - goto out; - ai = client_resolve(tmp->ai_addr); - freeaddrinfo(tmp); - } - if (!client_check(exp->m_client, ai)) - continue; - } + if (use_ipaddr && !client_check(exp->m_client, ai)) + continue; if (!found || subexport(&exp->m_export, found)) { found = &exp->m_export; free(found_path); @@ -1071,12 +1080,7 @@ static void nfsd_export(FILE *f) auth_reload(); if (use_ipaddr) { - struct addrinfo *tmp; - tmp = host_pton(dom); - if (tmp == NULL) - goto out; - ai = client_resolve(tmp->ai_addr); - freeaddrinfo(tmp); + ai = lookup_client_addr(dom); if (!ai) goto out; }