diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-01-21 15:36:50 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-01-31 16:24:48 +0100 |
| commit | 91a007f5ba25a0e4d554d5466e1284068207651b (patch) | |
| tree | 8342e464cc545651b71c03ee0b27d6e07712e742 /windows/nsis-plugins/src/driverlogic/driverlogicops.cpp | |
| parent | 60d01c3525f4d3c133d517702997d83c463df3ba (diff) | |
| download | mullvadvpn-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.cpp | 55 |
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) |
