summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOdd Stranne <odd@mullvad.net>2020-05-25 12:11:46 +0200
committerOdd Stranne <odd@mullvad.net>2020-05-25 12:11:46 +0200
commit4374667d5b8b76a90dc2a2a5c466102bb9c84add (patch)
tree3bb34971a22a883a88bdc3d8ea06f26e71fa181b
parentcde23508dd4a7b242725a7f4639a7aa8d875c872 (diff)
parent1eda5b19dd3aa48ca12f5df40441b09ba60dabe3 (diff)
downloadmullvadvpn-4374667d5b8b76a90dc2a2a5c466102bb9c84add.tar.xz
mullvadvpn-4374667d5b8b76a90dc2a2a5c466102bb9c84add.zip
Merge branch 'win-fix-network-event-race'
-rw-r--r--CHANGELOG.md2
-rw-r--r--windows/winnet/src/winnet/networkadaptermonitor.cpp10
-rw-r--r--windows/winnet/src/winnet/networkadaptermonitor.h4
3 files changed, 15 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d270f254db..a14a9d99fc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -31,6 +31,8 @@ Line wrap the file at 100 chars. Th
- Fix WireGuard key status events being lost by the UI, causing stale information to be shown.
- Fix time left in account not showing in settings screen.
+#### Windows
+- Fix race in network adapter monitor that could result in data corruption and crashes.
## [2020.5-beta1] - 2020-05-18
### Added
diff --git a/windows/winnet/src/winnet/networkadaptermonitor.cpp b/windows/winnet/src/winnet/networkadaptermonitor.cpp
index 92eab84932..2cbffd1198 100644
--- a/windows/winnet/src/winnet/networkadaptermonitor.cpp
+++ b/windows/winnet/src/winnet/networkadaptermonitor.cpp
@@ -276,6 +276,16 @@ void __stdcall NetworkAdapterMonitor::Callback(void *context, MIB_IPINTERFACE_RO
{
auto inst = reinterpret_cast<NetworkAdapterMonitor *>(context);
+ //
+ // Calls into this function are supposed to be serialized by Windows.
+ // That's not true on Windows 10 :-(
+ //
+ // This can be easily reproduced by changing the callback to never return,
+ // and observing more events being delivered.
+ //
+
+ std::scoped_lock<std::mutex> lock(inst->m_callbackLock);
+
try
{
inst->callback(hint, updateType);
diff --git a/windows/winnet/src/winnet/networkadaptermonitor.h b/windows/winnet/src/winnet/networkadaptermonitor.h
index fe78bb7e2d..044fa62d54 100644
--- a/windows/winnet/src/winnet/networkadaptermonitor.h
+++ b/windows/winnet/src/winnet/networkadaptermonitor.h
@@ -9,7 +9,7 @@
#include <windows.h>
#include <functional>
#include <vector>
-
+#include <mutex>
class NetworkAdapterMonitor
{
@@ -59,6 +59,8 @@ private:
std::shared_ptr<IDataProvider> m_dataProvider;
+ std::mutex m_callbackLock;
+
MIB_IF_ROW2 getAdapter(NET_LUID luid) const;
bool hasIPv4Interface(NET_LUID luid) const;