From: Michael Meffie Date: Tue, 4 Nov 2014 00:06:15 +0000 (-0500) Subject: avoid writing loopback addresses into CellServDB X-Git-Tag: upstream/1.8.0_pre1^2~516 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=e4a8a7a38dbf29e89bc1a7b6b017447a6aa0c764;p=packages%2Fo%2Fopenafs.git avoid writing loopback addresses into CellServDB Do not use loopback addresses for the server side CellServDB file. Use getaddrinfo() instead of gethostbyname() to look up a list of IPv4 addresses for a given hostname, and take the first non-loopback address. This avoids writing a loopback address into the CellServDB on systems such as Debian, which map the address 127.0.1.1 to the hostname in the /etc/hosts file. Change-Id: I11521df50262ca80c7db21b7b44671d94bef3587 Reviewed-on: http://gerrit.openafs.org/11585 Tested-by: BuildBot Reviewed-by: D Brashear --- diff --git a/src/auth/writeconfig.c b/src/auth/writeconfig.c index ad7c0b9fd..715d8a872 100644 --- a/src/auth/writeconfig.c +++ b/src/auth/writeconfig.c @@ -34,14 +34,30 @@ VerifyEntries(struct afsconf_cell *aci) if (aci->hostAddr[i].sin_addr.s_addr == 0) { /* no address spec'd */ if (*(aci->hostName[i]) != 0) { - th = gethostbyname(aci->hostName[i]); - if (!th) { - printf("Host %s not found in host database...\n", - aci->hostName[i]); + int code; + struct addrinfo hints; + struct addrinfo *result; + struct addrinfo *rp; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_DGRAM; + + code = getaddrinfo(aci->hostName[i], NULL, &hints, &result); + if (code) { + return AFSCONF_FAILURE; + } + for (rp = result; rp != NULL; rp = rp->ai_next) { + struct sockaddr_in *sa = (struct sockaddr_in *)rp->ai_addr; + if (!rx_IsLoopbackAddr(ntohl(sa->sin_addr.s_addr))) { + aci->hostAddr[i].sin_addr.s_addr = sa->sin_addr.s_addr; + break; + } + } + freeaddrinfo(result); + if (aci->hostAddr[i].sin_addr.s_addr == 0) { return AFSCONF_FAILURE; } - memcpy(&aci->hostAddr[i].sin_addr, th->h_addr, - sizeof(afs_int32)); } /* otherwise we're deleting this entry */ } else {