Prechádzať zdrojové kódy

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 rokov pred
rodič
commit
697520f1f5
1 zmenil súbory, kde vykonal 30 pridanie a 21 odobranie
  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);
+            }
+        }
 	}
 }