소스 검색

Dont write IPv6 addresses to IPv4 sections of registry TCPIP settings.

Also, dont add the prefix length to the IP addresses in there.

Appears to fix Github Issue #357.  Still waiting on some info from Microsoft for confirmation of a few things.
Grant Limberg 8 년 전
부모
커밋
697520f1f5
1개의 변경된 파일30개의 추가작업 그리고 21개의 파일을 삭제
  1. 30 21
      osdep/WindowsEthernetTap.cpp

+ 30 - 21
osdep/WindowsEthernetTap.cpp

@@ -672,6 +672,7 @@ bool WindowsEthernetTap::addIp(const InetAddress &ip)
 {
 	if (!ip.netmaskBits()) // sanity check... netmask of 0.0.0.0 is WUT?
 		return false;
+
 	Mutex::Lock _l(_assignedIps_m);
 	if (std::find(_assignedIps.begin(),_assignedIps.end(),ip) != _assignedIps.end())
 		return true;
@@ -682,6 +683,9 @@ bool WindowsEthernetTap::addIp(const InetAddress &ip)
 
 bool WindowsEthernetTap::removeIp(const InetAddress &ip)
 {
+    if (ip.isV6())
+        return true;
+
 	{
 		Mutex::Lock _l(_assignedIps_m);
 		std::vector<InetAddress>::iterator aip(std::find(_assignedIps.begin(),_assignedIps.end(),ip));
@@ -713,18 +717,20 @@ bool WindowsEthernetTap::removeIp(const InetAddress &ip)
 							DeleteUnicastIpAddressEntry(&(ipt->Table[i]));
 							FreeMibTable(ipt);
 
-							std::vector<std::string> regIps(_getRegistryIPv4Value("IPAddress"));
-							std::vector<std::string> regSubnetMasks(_getRegistryIPv4Value("SubnetMask"));
-							std::string ipstr(ip.toIpString());
-							for(std::vector<std::string>::iterator rip(regIps.begin()),rm(regSubnetMasks.begin());((rip!=regIps.end())&&(rm!=regSubnetMasks.end()));++rip,++rm) {
-								if (*rip == ipstr) {
-									regIps.erase(rip);
-									regSubnetMasks.erase(rm);
-									_setRegistryIPv4Value("IPAddress",regIps);
-									_setRegistryIPv4Value("SubnetMask",regSubnetMasks);
-									break;
-								}
-							}
+                            if (ip.isV4()) {
+                                std::vector<std::string> regIps(_getRegistryIPv4Value("IPAddress"));
+                                std::vector<std::string> regSubnetMasks(_getRegistryIPv4Value("SubnetMask"));
+                                std::string ipstr(ip.toIpString());
+                                for (std::vector<std::string>::iterator rip(regIps.begin()), rm(regSubnetMasks.begin()); ((rip != regIps.end()) && (rm != regSubnetMasks.end())); ++rip, ++rm) {
+                                    if (*rip == ipstr) {
+                                        regIps.erase(rip);
+                                        regSubnetMasks.erase(rm);
+                                        _setRegistryIPv4Value("IPAddress", regIps);
+                                        _setRegistryIPv4Value("SubnetMask", regSubnetMasks);
+                                        break;
+                                    }
+                                }
+                            }
 
 							return true;
 						}
@@ -1195,15 +1201,18 @@ void WindowsEthernetTap::_syncIps()
 			CreateUnicastIpAddressEntry(&ipr);
 		}
 
-		std::string ipStr(aip->toString());
-		std::vector<std::string> regIps(_getRegistryIPv4Value("IPAddress"));
-		if (std::find(regIps.begin(),regIps.end(),ipStr) == regIps.end()) {
-			std::vector<std::string> regSubnetMasks(_getRegistryIPv4Value("SubnetMask"));
-			regIps.push_back(ipStr);
-			regSubnetMasks.push_back(aip->netmask().toIpString());
-			_setRegistryIPv4Value("IPAddress",regIps);
-			_setRegistryIPv4Value("SubnetMask",regSubnetMasks);
-		}
+        if (aip->isV4())
+        {
+            std::string ipStr(aip->toIpString());
+            std::vector<std::string> regIps(_getRegistryIPv4Value("IPAddress"));
+            if (std::find(regIps.begin(), regIps.end(), ipStr) == regIps.end()) {
+                std::vector<std::string> regSubnetMasks(_getRegistryIPv4Value("SubnetMask"));
+                regIps.push_back(ipStr);
+                regSubnetMasks.push_back(aip->netmask().toIpString());
+                _setRegistryIPv4Value("IPAddress", regIps);
+                _setRegistryIPv4Value("SubnetMask", regSubnetMasks);
+            }
+        }
 	}
 }