When mountd is creating sockets, it iterates over all addresses specified

in the "hosts" array and eventually looks up the network address with
getaddrinfo(). At one point it checks for a numeric address and if it
sees one, it sets a hint parameter to force getaddrinfo to interpret the
host as a numeric address. However that hint is not cleared for subsequent
iterations of the loop and if any hosts seen after this point are host names,
getaddrinfo will fail on the name.  The result of this bug is that you cannot
pass a host name to the -h flag.

Unfortunately, the first iteration will either process ::1 or 127.0.0.1,
so the flag is set on the first iteration and all host names will fail
to be processed.

The same bug applies to rpc.lockd and rpc.statd, so fix them too.

Differential Revision:	https://reviews.freebsd.org/D1507
Reported by:	Dylan Martin
MFC after:	1 week
Sponsored by:	Sandvine Inc.
This commit is contained in:
Ryan Stone 2015-01-19 00:33:32 +00:00
parent 5eab7e5406
commit 9745de4c2c
3 changed files with 4 additions and 3 deletions

View File

@ -627,7 +627,6 @@ create_service(struct netconfig *nconf)
/* Get mountd's address on this transport */ /* Get mountd's address on this transport */
memset(&hints, 0, sizeof hints); memset(&hints, 0, sizeof hints);
hints.ai_flags = AI_PASSIVE;
hints.ai_family = si.si_af; hints.ai_family = si.si_af;
hints.ai_socktype = si.si_socktype; hints.ai_socktype = si.si_socktype;
hints.ai_protocol = si.si_proto; hints.ai_protocol = si.si_proto;
@ -644,6 +643,8 @@ create_service(struct netconfig *nconf)
sock_fd[sock_fdcnt++] = -1; /* Set invalid for now. */ sock_fd[sock_fdcnt++] = -1; /* Set invalid for now. */
mallocd_res = 0; mallocd_res = 0;
hints.ai_flags = AI_PASSIVE;
/* /*
* XXX - using RPC library internal functions. * XXX - using RPC library internal functions.
*/ */

View File

@ -518,7 +518,6 @@ create_service(struct netconfig *nconf)
/* Get rpc.statd's address on this transport */ /* Get rpc.statd's address on this transport */
memset(&hints, 0, sizeof hints); memset(&hints, 0, sizeof hints);
hints.ai_flags = AI_PASSIVE;
hints.ai_family = si.si_af; hints.ai_family = si.si_af;
hints.ai_socktype = si.si_socktype; hints.ai_socktype = si.si_socktype;
hints.ai_protocol = si.si_proto; hints.ai_protocol = si.si_proto;
@ -534,6 +533,7 @@ create_service(struct netconfig *nconf)
out_of_mem(); out_of_mem();
sock_fd[sock_fdcnt++] = -1; /* Set invalid for now. */ sock_fd[sock_fdcnt++] = -1; /* Set invalid for now. */
mallocd_res = 0; mallocd_res = 0;
hints.ai_flags = AI_PASSIVE;
/* /*
* XXX - using RPC library internal functions. * XXX - using RPC library internal functions.

View File

@ -343,7 +343,6 @@ create_service(struct netconfig *nconf)
/* Get rpc.statd's address on this transport */ /* Get rpc.statd's address on this transport */
memset(&hints, 0, sizeof hints); memset(&hints, 0, sizeof hints);
hints.ai_flags = AI_PASSIVE;
hints.ai_family = si.si_af; hints.ai_family = si.si_af;
hints.ai_socktype = si.si_socktype; hints.ai_socktype = si.si_socktype;
hints.ai_protocol = si.si_proto; hints.ai_protocol = si.si_proto;
@ -359,6 +358,7 @@ create_service(struct netconfig *nconf)
out_of_mem(); out_of_mem();
sock_fd[sock_fdcnt++] = -1; /* Set invalid for now. */ sock_fd[sock_fdcnt++] = -1; /* Set invalid for now. */
mallocd_res = 0; mallocd_res = 0;
hints.ai_flags = AI_PASSIVE;
/* /*
* XXX - using RPC library internal functions. * XXX - using RPC library internal functions.