You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.9 KiB
51 lines
1.9 KiB
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; |
|
}
|
|
|