summaryrefslogtreecommitdiffhomepage
path: root/windows
diff options
context:
space:
mode:
authorOdd Stranne <odd@mullvad.net>2019-02-21 10:25:01 +0100
committerOdd Stranne <odd@mullvad.net>2019-02-21 10:25:01 +0100
commit0a00c5c1f51d7b81fb8bedd41c4bfb4481e54e88 (patch)
tree6012c4ce3e40514bbae550a3c2983425c010b3df /windows
parent4920941335cd2b724c6cf922a9f5fbc944d3a5c6 (diff)
parentbc745e4da6dacbfcf16bb6b3118b44424844b55f (diff)
downloadmullvadvpn-0a00c5c1f51d7b81fb8bedd41c4bfb4481e54e88.tar.xz
mullvadvpn-0a00c5c1f51d7b81fb8bedd41c4bfb4481e54e88.zip
Merge branch 'windns-improve-error-handling'
Diffstat (limited to 'windows')
-rw-r--r--windows/windns/src/windns/dnsagent.cpp42
-rw-r--r--windows/windns/src/windns/dnsagent.h2
2 files changed, 36 insertions, 8 deletions
diff --git a/windows/windns/src/windns/dnsagent.cpp b/windows/windns/src/windns/dnsagent.cpp
index e9b3a4246d..04bdcdb47d 100644
--- a/windows/windns/src/windns/dnsagent.cpp
+++ b/windows/windns/src/windns/dnsagent.cpp
@@ -18,12 +18,33 @@ DnsAgent::DnsAgent(Protocol protocol, INameServerSource *nameServerSource, IReco
, m_shutdownEvent(nullptr)
{
constructNameServerUpdateEvent();
- constructRootMonitor();
- startTrackingInterfaces(discoverInterfaces());
- updateRecoveryData();
+ try
+ {
+ constructRootMonitor();
+
+ if (false == startTrackingInterfaces(discoverInterfaces()))
+ {
+ throw std::runtime_error("Could not complete initial settings update on interfaces");
+ }
+
+ updateRecoveryData();
+
+ constructThread();
+ }
+ catch (...)
+ {
+ if (nullptr != m_shutdownEvent)
+ {
+ CloseHandle(m_shutdownEvent);
+ }
+
+ m_nameServerSource->unsubscribe(m_serverSourceEvent);
+ CloseHandle(m_serverSourceEvent);
+
+ throw;
+ }
- constructThread();
}
DnsAgent::~DnsAgent()
@@ -134,7 +155,10 @@ void DnsAgent::thread()
if (WAIT_FAILED == status)
{
- m_logSink->error("Failed to wait on events. Restarting wait in 1 minute.");
+ const auto error = common::error::FormatWindowsErrorPlain(GetLastError());
+ const auto message = std::string("Failed to wait on events. Restarting wait in 1 minute. Error: ").append(error);
+
+ m_logSink->error(message.c_str());
if (WAIT_OBJECT_0 == WaitForSingleObject(m_shutdownEvent, 1000 * 60))
{
@@ -381,17 +405,19 @@ void DnsAgent::setNameServers(const std::wstring &interfaceGuid, const std::vect
}
}
-void DnsAgent::startTrackingInterfaces(const std::vector<std::wstring> &interfaces)
+bool DnsAgent::startTrackingInterfaces(const std::vector<std::wstring> &interfaces)
{
const auto enforcedServers = m_nameServerSource->getNameServers(m_protocol);
+ bool successful = true;
+
for (const auto &iface : interfaces)
{
const auto literalOperation = std::wstring(L"Start tracking interface ").append(iface);
XTRACE(literalOperation);
- ConfineOperation(common::string::ToAnsi(literalOperation).c_str(), m_logSink, [&]()
+ successful &= ConfineOperation(common::string::ToAnsi(literalOperation).c_str(), m_logSink, [&]()
{
InterfaceSnap snap(m_protocol, iface);
@@ -414,6 +440,8 @@ void DnsAgent::startTrackingInterfaces(const std::vector<std::wstring> &interfac
}
});
}
+
+ return successful;
}
void DnsAgent::stopTrackingInterfaces(const std::vector<std::wstring> &interfaces)
diff --git a/windows/windns/src/windns/dnsagent.h b/windows/windns/src/windns/dnsagent.h
index db73257330..a45cf75f00 100644
--- a/windows/windns/src/windns/dnsagent.h
+++ b/windows/windns/src/windns/dnsagent.h
@@ -76,7 +76,7 @@ private:
void setNameServers(const std::wstring &interfaceGuid, const std::vector<std::wstring> &enforcedServers);
- void startTrackingInterfaces(const std::vector<std::wstring> &interfaces);
+ bool startTrackingInterfaces(const std::vector<std::wstring> &interfaces);
void stopTrackingInterfaces(const std::vector<std::wstring> &interfaces);
void updateRecoveryData();