Просмотр исходного кода

Ensure erase() is called after std::unique()

Without this the duplicates are just moved to the end of the collection,
but not actually erased.
Chris Spiegel 2 месяцев назад
Родитель
Сommit
616698fa91
3 измененных файлов с 5 добавлено и 5 удалено
  1. 2 2
      osdep/BSDEthernetTap.cpp
  2. 1 1
      osdep/MacKextEthernetTap.cpp
  3. 2 2
      osdep/NetBSDEthernetTap.cpp

+ 2 - 2
osdep/BSDEthernetTap.cpp

@@ -339,7 +339,7 @@ std::vector<InetAddress> BSDEthernetTap::ips() const
 		freeifaddrs(ifa);
 		freeifaddrs(ifa);
 
 
 	std::sort(r.begin(), r.end());
 	std::sort(r.begin(), r.end());
-	std::unique(r.begin(), r.end());
+	r.erase(std::unique(r.begin(), r.end()), r.end());
 
 
 	_ifaddrs = r;
 	_ifaddrs = r;
 
 
@@ -394,7 +394,7 @@ void BSDEthernetTap::scanMulticastGroups(std::vector<MulticastGroup>& added, std
 		newGroups.push_back(MulticastGroup::deriveMulticastGroupForAddressResolution(*ip));
 		newGroups.push_back(MulticastGroup::deriveMulticastGroupForAddressResolution(*ip));
 
 
 	std::sort(newGroups.begin(), newGroups.end());
 	std::sort(newGroups.begin(), newGroups.end());
-	std::unique(newGroups.begin(), newGroups.end());
+	newGroups.erase(std::unique(newGroups.begin(), newGroups.end()), newGroups.end());
 
 
 	for (std::vector<MulticastGroup>::iterator m(newGroups.begin()); m != newGroups.end(); ++m) {
 	for (std::vector<MulticastGroup>::iterator m(newGroups.begin()); m != newGroups.end(); ++m) {
 		if (! std::binary_search(_multicastGroups.begin(), _multicastGroups.end(), *m))
 		if (! std::binary_search(_multicastGroups.begin(), _multicastGroups.end(), *m))

+ 1 - 1
osdep/MacKextEthernetTap.cpp

@@ -607,7 +607,7 @@ void MacKextEthernetTap::scanMulticastGroups(std::vector<MulticastGroup>& added,
 		newGroups.push_back(MulticastGroup::deriveMulticastGroupForAddressResolution(*ip));
 		newGroups.push_back(MulticastGroup::deriveMulticastGroupForAddressResolution(*ip));
 
 
 	std::sort(newGroups.begin(), newGroups.end());
 	std::sort(newGroups.begin(), newGroups.end());
-	std::unique(newGroups.begin(), newGroups.end());
+	newGroups.erase(std::unique(newGroups.begin(), newGroups.end()), newGroups.end());
 
 
 	for (std::vector<MulticastGroup>::iterator m(newGroups.begin()); m != newGroups.end(); ++m) {
 	for (std::vector<MulticastGroup>::iterator m(newGroups.begin()); m != newGroups.end(); ++m) {
 		if (! std::binary_search(_multicastGroups.begin(), _multicastGroups.end(), *m))
 		if (! std::binary_search(_multicastGroups.begin(), _multicastGroups.end(), *m))

+ 2 - 2
osdep/NetBSDEthernetTap.cpp

@@ -316,7 +316,7 @@ std::vector<InetAddress> NetBSDEthernetTap::ips() const
 		freeifaddrs(ifa);
 		freeifaddrs(ifa);
 
 
 	std::sort(r.begin(), r.end());
 	std::sort(r.begin(), r.end());
-	std::unique(r.begin(), r.end());
+	r.erase(std::unique(r.begin(), r.end()), r.end());
 
 
 	return r;
 	return r;
 }
 }
@@ -367,7 +367,7 @@ void NetBSDEthernetTap::scanMulticastGroups(std::vector<MulticastGroup>& added,
 		newGroups.push_back(MulticastGroup::deriveMulticastGroupForAddressResolution(*ip));
 		newGroups.push_back(MulticastGroup::deriveMulticastGroupForAddressResolution(*ip));
 
 
 	std::sort(newGroups.begin(), newGroups.end());
 	std::sort(newGroups.begin(), newGroups.end());
-	std::unique(newGroups.begin(), newGroups.end());
+	newGroups.erase(std::unique(newGroups.begin(), newGroups.end()), newGroups.end());
 
 
 	for (std::vector<MulticastGroup>::iterator m(newGroups.begin()); m != newGroups.end(); ++m) {
 	for (std::vector<MulticastGroup>::iterator m(newGroups.begin()); m != newGroups.end(); ++m) {
 		if (! std::binary_search(_multicastGroups.begin(), _multicastGroups.end(), *m))
 		if (! std::binary_search(_multicastGroups.begin(), _multicastGroups.end(), *m))