Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2014-05-19 19:57:22 +0400
committerCorinna Vinschen <corinna@vinschen.de>2014-05-19 19:57:22 +0400
commite0f53cfe6ab8f0c52cfebdfafc4d03a692770228 (patch)
tree5aa106ab4f88aea765b0eb45c3e1a280e375b47c /winsup/cygwin/net.cc
parenta25a812338043903e82822093b0b5ae3e1af9996 (diff)
* net.cc (call_gaa): Fix setting pa_ret pointer in case of an error
from GetAdaptersAddresses (CID 60218). (get_ifs): Add missing braces in AF_INET6 case which broke netmask computation. Break out of loop if prefix gets <= 0 (CID 59939).
Diffstat (limited to 'winsup/cygwin/net.cc')
-rw-r--r--winsup/cygwin/net.cc14
1 files changed, 8 insertions, 6 deletions
diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc
index ab36a30b4..010cf2435 100644
--- a/winsup/cygwin/net.cc
+++ b/winsup/cygwin/net.cc
@@ -1673,7 +1673,7 @@ call_gaa (LPVOID param)
if (ret != ERROR_SUCCESS)
{
free (pa0);
- *p->pa_ret = pa0;
+ *p->pa_ret = NULL;
}
else
*p->pa_ret = pa0;
@@ -1685,7 +1685,7 @@ bool
get_adapters_addresses (PIP_ADAPTER_ADDRESSES *pa_ret, ULONG family)
{
DWORD ret;
- gaa_wa param = { family, pa_ret ?: NULL };
+ gaa_wa param = { family, pa_ret };
if ((uintptr_t) &param >= (uintptr_t) 0x80000000L
&& wincap.has_gaa_largeaddress_bug ())
@@ -2080,10 +2080,12 @@ get_ifs (ULONG family)
break;
case AF_INET6:
if_sin6 = (struct sockaddr_in6 *) &ifp->ifa_netmask;
- for (cnt = 0; cnt < 4 && prefix; ++cnt, prefix -= 32)
- if_sin6->sin6_addr.s6_addr32[cnt] = UINT32_MAX;
- if (prefix < 32)
- if_sin6->sin6_addr.s6_addr32[cnt] <<= 32 - prefix;
+ for (cnt = 0; cnt < 4 && prefix > 0; ++cnt, prefix -= 32)
+ {
+ if_sin6->sin6_addr.s6_addr32[cnt] = UINT32_MAX;
+ if (prefix < 32)
+ if_sin6->sin6_addr.s6_addr32[cnt] <<= 32 - prefix;
+ }
break;
}
ifp->ifa_ifa.ifa_netmask = (struct sockaddr *) &ifp->ifa_netmask;