summaryrefslogtreecommitdiff
path: root/src/SocketCore.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/SocketCore.cc')
-rw-r--r--src/SocketCore.cc19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/SocketCore.cc b/src/SocketCore.cc
index e090e27a..88fdf581 100644
--- a/src/SocketCore.cc
+++ b/src/SocketCore.cc
@@ -1555,6 +1555,13 @@ bool ipv4AddrConfigured = true;
bool ipv6AddrConfigured = true;
} // namespace
+#ifdef __MINGW32__
+namespace {
+const uint32_t APIPA_IPV4_BEGIN = 2851995649u; // 169.254.0.1
+const uint32_t APIPA_IPV4_END = 2852061183u; // 169.254.255.255
+} // namespace
+#endif // __MINGW32__
+
void checkAddrconfig()
{
#ifdef __MINGW32__
@@ -1585,19 +1592,27 @@ void checkAddrconfig()
sockaddr_union ad;
int rv;
for(IP_ADAPTER_ADDRESSES* p = buf; p; p = p->Next) {
+ if(p->IfType == IF_TYPE_TUNNEL) {
+ // Skip tunnel interface because Windows7 automatically setup
+ // this for IPv6.
+ continue;
+ }
PIP_ADAPTER_UNICAST_ADDRESS ucaddr = p->FirstUnicastAddress;
if(ucaddr) {
for(PIP_ADAPTER_UNICAST_ADDRESS i = ucaddr; i; i = i->Next) {
bool found = false;
switch(i->Address.iSockaddrLength) {
- case sizeof(sockaddr_in):
+ case sizeof(sockaddr_in): {
memcpy(&ad.storage, i->Address.lpSockaddr,
i->Address.iSockaddrLength);
- if(ad.in.sin_addr.s_addr != htonl(INADDR_LOOPBACK)) {
+ uint32_t haddr = ntohl(ad.in.sin_addr.s_addr);
+ if(haddr != INADDR_LOOPBACK &&
+ (haddr < APIPA_IPV4_BEGIN || APIPA_IPV4_END <= haddr)) {
ipv4AddrConfigured = true;
found = true;
}
break;
+ }
case sizeof(sockaddr_in6):
memcpy(&ad.storage, i->Address.lpSockaddr,
i->Address.iSockaddrLength);