summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@redhat.com>2012-05-03 14:59:27 -0400
committerSteve Dickson <steved@redhat.com>2012-05-03 15:12:09 -0400
commit005c49a063544b4005b5b7c3c28ed48c197f66ac (patch)
tree48d0e18018ac9eb03b83887527a19df236501951
parentb46c04422f2a4ae76b89bf43a21839b1c5a1fc79 (diff)
downloadnfs-utils-005c49a063544b4005b5b7c3c28ed48c197f66ac.tar.gz
nfs-utils-005c49a063544b4005b5b7c3c28ed48c197f66ac.tar.xz
nfs-utils-005c49a063544b4005b5b7c3c28ed48c197f66ac.zip
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 <bfields@redhat.com> Signed-off-by: Steve Dickson <steved@redhat.com>
-rw-r--r--utils/mountd/cache.c40
1 files changed, 22 insertions, 18 deletions
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;
}