summaryrefslogtreecommitdiffhomepage
path: root/windows/nsis-plugins/src/driverlogic/driverlogicops.cpp
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-01-21 15:36:50 +0100
committerDavid Lönnhager <david.l@mullvad.net>2020-01-31 16:24:48 +0100
commit91a007f5ba25a0e4d554d5466e1284068207651b (patch)
tree8342e464cc545651b71c03ee0b27d6e07712e742 /windows/nsis-plugins/src/driverlogic/driverlogicops.cpp
parent60d01c3525f4d3c133d517702997d83c463df3ba (diff)
downloadmullvadvpn-91a007f5ba25a0e4d554d5466e1284068207651b.tar.xz
mullvadvpn-91a007f5ba25a0e4d554d5466e1284068207651b.zip
Improve robustness of TAP enumeration
Diffstat (limited to 'windows/nsis-plugins/src/driverlogic/driverlogicops.cpp')
-rw-r--r--windows/nsis-plugins/src/driverlogic/driverlogicops.cpp55
1 files changed, 36 insertions, 19 deletions
diff --git a/windows/nsis-plugins/src/driverlogic/driverlogicops.cpp b/windows/nsis-plugins/src/driverlogic/driverlogicops.cpp
index 66fa2d9f24..b837565de1 100644
--- a/windows/nsis-plugins/src/driverlogic/driverlogicops.cpp
+++ b/windows/nsis-plugins/src/driverlogic/driverlogicops.cpp
@@ -290,23 +290,23 @@ std::set<NetworkAdapter> GetTapAdapters(const std::wstring &tapHardwareId)
THROW_WINDOWS_ERROR(lastError, "SetupDiEnumDeviceInfo() failed while enumerating network adapters");
}
- //
- // Check whether this is a TAP adapter
- //
-
- const auto hardwareId = GetDeviceRegistryStringProperty(devInfo, &devInfoData, SPDRP_HARDWAREID);
- if (!hardwareId.has_value()
- || wcscmp(hardwareId.value().c_str(), tapHardwareId.c_str()) != 0)
+ try
{
- continue;
- }
+ //
+ // Check whether this is a TAP adapter
+ //
+
+ const auto hardwareId = GetDeviceRegistryStringProperty(devInfo, &devInfoData, SPDRP_HARDWAREID);
+ if (!hardwareId.has_value()
+ || wcscmp(hardwareId.value().c_str(), tapHardwareId.c_str()) != 0)
+ {
+ continue;
+ }
- //
- // Construct NetworkAdapter
- //
+ //
+ // Construct NetworkAdapter
+ //
- try
- {
const std::wstring guid = GetNetCfgInstanceId(devInfo, devInfoData);
GUID guidObj = common::Guid::FromString(guid);
@@ -424,7 +424,7 @@ DeletionResult DeleteOldMullvadAdapter()
if (INVALID_HANDLE_VALUE == devInfo)
{
- THROW_WINDOWS_ERROR(GetLastError(), "SetupDiGetClassDevs() failed");
+ THROW_WINDOWS_ERROR(GetLastError(), "SetupDiGetClassDevsW() failed");
}
common::memory::ScopeDestructor cleanupDevList;
@@ -452,11 +452,18 @@ DeletionResult DeleteOldMullvadAdapter()
THROW_WINDOWS_ERROR(lastError, "Error enumerating network adapters");
}
- const auto hardwareId = GetDeviceRegistryStringProperty(devInfo, &devInfoData, SPDRP_HARDWAREID);
-
- if (hardwareId.has_value()
- && wcscmp(DEPRECATED_TAP_HARDWARE_ID, hardwareId.value().data()) == 0)
+ try
{
+ const auto hardwareId = GetDeviceRegistryStringProperty(devInfo, &devInfoData, SPDRP_HARDWAREID);
+
+ if (!hardwareId.has_value())
+ {
+ continue;
+ }
+ if (0 != wcscmp(DEPRECATED_TAP_HARDWARE_ID, hardwareId.value().data()))
+ {
+ continue;
+ }
if (0 != GetNetCfgInstanceId(devInfo, devInfoData).compare(mullvadGuid))
{
numRemainingAdapters++;
@@ -471,6 +478,16 @@ DeletionResult DeleteOldMullvadAdapter()
THROW_WINDOWS_ERROR(GetLastError(), "Error removing Mullvad TAP device");
}
}
+ catch (const std::exception & e)
+ {
+ //
+ // Log exception and skip this adapter
+ //
+
+ const auto msg =
+ std::string("Skipping TAP adapter due to exception caught while iterating: ").append(e.what());
+ PluginLog(common::string::ToWide(msg));
+ }
}
return (numRemainingAdapters > 0)