summaryrefslogtreecommitdiffhomepage
path: root/windows/winnet/src
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-06-22 16:04:33 +0200
committerDavid Lönnhager <david.l@mullvad.net>2021-06-23 13:43:01 +0200
commit5d32bd55ec896ef94b9d4e8111bf6ed683ad6ecd (patch)
tree3926e80aa4e1cb3d292ab2e256fe60da18f1c2f6 /windows/winnet/src
parent3ff99131790ca0a953247a07a45909e02a0cf313 (diff)
downloadmullvadvpn-5d32bd55ec896ef94b9d4e8111bf6ed683ad6ecd.tar.xz
mullvadvpn-5d32bd55ec896ef94b9d4e8111bf6ed683ad6ecd.zip
Handle deleted devices in NetworkAdapterMonitor
Diffstat (limited to 'windows/winnet/src')
-rw-r--r--windows/winnet/src/winnet/networkadaptermonitor.cpp31
-rw-r--r--windows/winnet/src/winnet/networkadaptermonitor.h5
2 files changed, 23 insertions, 13 deletions
diff --git a/windows/winnet/src/winnet/networkadaptermonitor.cpp b/windows/winnet/src/winnet/networkadaptermonitor.cpp
index 2cbffd1198..3cc21ece13 100644
--- a/windows/winnet/src/winnet/networkadaptermonitor.cpp
+++ b/windows/winnet/src/winnet/networkadaptermonitor.cpp
@@ -138,15 +138,15 @@ bool NetworkAdapterMonitor::hasIPv6Interface(NET_LUID luid) const
return false;
}
-std::vector<MIB_IF_ROW2>::iterator NetworkAdapterMonitor::findFilteredAdapter(const MIB_IF_ROW2 &adapter)
+std::vector<MIB_IF_ROW2>::iterator NetworkAdapterMonitor::findFilteredAdapter(const NET_LUID adapter)
{
return std::find_if(m_filteredAdapters.begin(), m_filteredAdapters.end(), [&adapter](const MIB_IF_ROW2 &elem)
{
- return elem.InterfaceLuid.Value == adapter.InterfaceLuid.Value;
+ return elem.InterfaceLuid.Value == adapter.Value;
});
}
-MIB_IF_ROW2 NetworkAdapterMonitor::getAdapter(NET_LUID luid) const
+std::optional<MIB_IF_ROW2> NetworkAdapterMonitor::getAdapter(NET_LUID luid) const
{
MIB_IF_ROW2 rowOut = {0};
rowOut.InterfaceLuid = luid;
@@ -154,7 +154,11 @@ MIB_IF_ROW2 NetworkAdapterMonitor::getAdapter(NET_LUID luid) const
if (NO_ERROR == status)
{
- return rowOut;
+ return std::make_optional(rowOut);
+ }
+ if (ERROR_FILE_NOT_FOUND == status)
+ {
+ return std::nullopt;
}
std::stringstream ss;
@@ -166,16 +170,19 @@ MIB_IF_ROW2 NetworkAdapterMonitor::getAdapter(NET_LUID luid) const
void NetworkAdapterMonitor::callback(const MIB_IPINTERFACE_ROW *hint, MIB_NOTIFICATION_TYPE)
{
- MIB_IF_ROW2 iface = getAdapter(hint->InterfaceLuid);
+ const auto ifaceOpt = getAdapter(hint->InterfaceLuid);
- bool adapterEnabled = NET_IF_ADMIN_STATUS_UP == iface.AdminStatus
- && (hasIPv4Interface(iface.InterfaceLuid)
- || hasIPv6Interface(iface.InterfaceLuid));
+ bool adapterEnabled = ifaceOpt.has_value()
+ && NET_IF_ADMIN_STATUS_UP == ifaceOpt->AdminStatus
+ && (hasIPv4Interface(ifaceOpt->InterfaceLuid)
+ || hasIPv6Interface(ifaceOpt->InterfaceLuid));
const auto adapterIt = m_adapters.find(hint->InterfaceLuid.Value);
if (adapterEnabled)
{
+ const auto &iface = *ifaceOpt;
+
//
// Check if the adapter has been added or updated
//
@@ -210,7 +217,7 @@ void NetworkAdapterMonitor::callback(const MIB_IPINTERFACE_ROW *hint, MIB_NOTIFI
//
// Report Add event if this is new
//
- if (m_filteredAdapters.end() == findFilteredAdapter(iface))
+ if (m_filteredAdapters.end() == findFilteredAdapter(iface.InterfaceLuid))
{
m_filteredAdapters.push_back(iface);
m_updateSink(m_filteredAdapters, &iface, UpdateType::Add);
@@ -226,7 +233,7 @@ void NetworkAdapterMonitor::callback(const MIB_IPINTERFACE_ROW *hint, MIB_NOTIFI
// Synthesize a Delete event if we're no longer interested
// in this adapter
//
- const auto filteredIt = findFilteredAdapter(iface);
+ const auto filteredIt = findFilteredAdapter(iface.InterfaceLuid);
if (m_filteredAdapters.end() != filteredIt)
{
@@ -252,10 +259,12 @@ void NetworkAdapterMonitor::callback(const MIB_IPINTERFACE_ROW *hint, MIB_NOTIFI
m_adapters.erase(adapterIt);
- const auto filteredIt = findFilteredAdapter(iface);
+ const auto filteredIt = findFilteredAdapter(hint->InterfaceLuid);
if (m_filteredAdapters.end() != filteredIt)
{
+ const auto &iface = ifaceOpt.value_or(*filteredIt);
+
m_filteredAdapters.erase(filteredIt);
//
diff --git a/windows/winnet/src/winnet/networkadaptermonitor.h b/windows/winnet/src/winnet/networkadaptermonitor.h
index 044fa62d54..decf305b31 100644
--- a/windows/winnet/src/winnet/networkadaptermonitor.h
+++ b/windows/winnet/src/winnet/networkadaptermonitor.h
@@ -10,6 +10,7 @@
#include <functional>
#include <vector>
#include <mutex>
+#include <optional>
class NetworkAdapterMonitor
{
@@ -61,7 +62,7 @@ private:
std::mutex m_callbackLock;
- MIB_IF_ROW2 getAdapter(NET_LUID luid) const;
+ std::optional<MIB_IF_ROW2> getAdapter(NET_LUID luid) const;
bool hasIPv4Interface(NET_LUID luid) const;
bool hasIPv6Interface(NET_LUID luid) const;
@@ -69,7 +70,7 @@ private:
std::map<ULONG64, MIB_IF_ROW2> m_adapters;
std::vector<MIB_IF_ROW2> m_filteredAdapters;
- std::vector<MIB_IF_ROW2>::iterator findFilteredAdapter(const MIB_IF_ROW2 &adapter);
+ std::vector<MIB_IF_ROW2>::iterator findFilteredAdapter(const NET_LUID adapter);
HANDLE m_notificationHandle;
static void __stdcall Callback(void *context, MIB_IPINTERFACE_ROW *hint, MIB_NOTIFICATION_TYPE updateType);