diff --git a/pr/src/misc/prnetdb.c b/pr/src/misc/prnetdb.c --- a/pr/src/misc/prnetdb.c +++ b/pr/src/misc/prnetdb.c @@ -2047,35 +2047,43 @@ PR_GetPrefLoopbackAddrInfo(PRNetAddr* re return PR_FAILURE; #else PRADDRINFO *res, hints; PRStatus rv; memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_PASSIVE; rv = GETADDRINFO(NULL, tmpBuf, &hints, &res); if (rv == 0) { PRBool result_still_empty = PR_TRUE; PRADDRINFO* ai = res; do { PRNetAddr aNetAddr; while (ai && ai->ai_addrlen > sizeof(PRNetAddr)) ai = ai->ai_next; - if (ai) { - /* copy sockaddr to PRNetAddr */ - memcpy(&aNetAddr, ai->ai_addr, ai->ai_addrlen); - aNetAddr.raw.family = ai->ai_addr->sa_family; + if (!ai) { + break; + } + + /* copy sockaddr to PRNetAddr */ + memcpy(&aNetAddr, ai->ai_addr, ai->ai_addrlen); + aNetAddr.raw.family = ai->ai_addr->sa_family; # ifdef _PR_INET6 - if (AF_INET6 == aNetAddr.raw.family) aNetAddr.raw.family = PR_AF_INET6; + if (AF_INET6 == aNetAddr.raw.family) aNetAddr.raw.family = PR_AF_INET6; # endif - if (ai->ai_addrlen < sizeof(PRNetAddr)) + if (ai->ai_addrlen < sizeof(PRNetAddr)) memset(((char*)result) + ai->ai_addrlen, 0, sizeof(PRNetAddr) - ai->ai_addrlen); + if (result->raw.family == PR_AF_INET) { + aNetAddr.inet.port = htons(port); + } else { + aNetAddr.ipv6.port = htons(port); } /* If we obtain more than one result, prefer IPv6. */ if (result_still_empty || aNetAddr.raw.family == PR_AF_INET6) { memcpy(result, &aNetAddr, sizeof(PRNetAddr)); } result_still_empty = PR_FALSE; ai = ai->ai_next;