54 lines
1.7 KiB
Diff
54 lines
1.7 KiB
Diff
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;
|