diff options
| author | David Lönnhager <david.l@mullvad.net> | 2021-06-22 16:04:33 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2021-06-23 13:43:01 +0200 |
| commit | 5d32bd55ec896ef94b9d4e8111bf6ed683ad6ecd (patch) | |
| tree | 3926e80aa4e1cb3d292ab2e256fe60da18f1c2f6 /windows/winnet/src | |
| parent | 3ff99131790ca0a953247a07a45909e02a0cf313 (diff) | |
| download | mullvadvpn-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.cpp | 31 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/networkadaptermonitor.h | 5 |
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); |
