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 @@ -2209,28 +2209,38 @@ PR_GetPrefLoopbackAddrInfo(PRNetAddr *re 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)) - memset(((char*)result)+ai->ai_addrlen, 0, - sizeof(PRNetAddr) - ai->ai_addrlen); + if (ai->ai_addrlen < sizeof(PRNetAddr)) + memset(((char*)&aNetAddr)+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; }