diff options
| author | Odd Stranne <odd@mullvad.net> | 2020-05-25 12:11:46 +0200 |
|---|---|---|
| committer | Odd Stranne <odd@mullvad.net> | 2020-05-25 12:11:46 +0200 |
| commit | 4374667d5b8b76a90dc2a2a5c466102bb9c84add (patch) | |
| tree | 3bb34971a22a883a88bdc3d8ea06f26e71fa181b | |
| parent | cde23508dd4a7b242725a7f4639a7aa8d875c872 (diff) | |
| parent | 1eda5b19dd3aa48ca12f5df40441b09ba60dabe3 (diff) | |
| download | mullvadvpn-4374667d5b8b76a90dc2a2a5c466102bb9c84add.tar.xz mullvadvpn-4374667d5b8b76a90dc2a2a5c466102bb9c84add.zip | |
Merge branch 'win-fix-network-event-race'
| -rw-r--r-- | CHANGELOG.md | 2 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/networkadaptermonitor.cpp | 10 | ||||
| -rw-r--r-- | windows/winnet/src/winnet/networkadaptermonitor.h | 4 |
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; |
