diff options
| author | Odd Stranne <odd@mullvad.net> | 2019-03-15 14:56:38 +0100 |
|---|---|---|
| committer | Odd Stranne <odd@mullvad.net> | 2019-04-04 21:18:44 +0200 |
| commit | 80ab3d35449015b09378d902b731733a7db1d446 (patch) | |
| tree | cea977dc220c0725d404a82c998c7cbc1ddb8e11 | |
| parent | 64aa30a5c7b8cf87e84eafbee253ca75dbfe5834 (diff) | |
| download | mullvadvpn-80ab3d35449015b09378d902b731733a7db1d446.tar.xz mullvadvpn-80ab3d35449015b09378d902b731733a7db1d446.zip | |
Update/restore WinFw_Reset to work when called out-of-context
| -rw-r--r-- | windows/winfw/src/winfw/objectpurger.cpp | 14 | ||||
| -rw-r--r-- | windows/winfw/src/winfw/objectpurger.h | 2 | ||||
| -rw-r--r-- | windows/winfw/src/winfw/winfw.cpp | 15 |
3 files changed, 22 insertions, 9 deletions
diff --git a/windows/winfw/src/winfw/objectpurger.cpp b/windows/winfw/src/winfw/objectpurger.cpp index b9c6048658..60c32cd53e 100644 --- a/windows/winfw/src/winfw/objectpurger.cpp +++ b/windows/winfw/src/winfw/objectpurger.cpp @@ -4,6 +4,7 @@ #include "wfpobjecttype.h" #include "libwfp/filterengine.h" #include "libwfp/objectdeleter.h" +#include "libwfp/transaction.h" #include <algorithm> namespace @@ -52,3 +53,16 @@ ObjectPurger::RemovalFunctor ObjectPurger::GetRemoveAllFunctor() RemoveRange(engine, wfp::ObjectDeleter::DeleteProvider, registry.equal_range(WfpObjectType::Provider)); }; } + +//static +bool ObjectPurger::Execute(RemovalFunctor f) +{ + auto engine = wfp::FilterEngine::StandardSession(); + + auto wrapper = [&]() + { + return f(*engine), true; + }; + + return wfp::Transaction::Execute(*engine, wrapper); +} diff --git a/windows/winfw/src/winfw/objectpurger.h b/windows/winfw/src/winfw/objectpurger.h index fa82a86f91..62f7ce2e11 100644 --- a/windows/winfw/src/winfw/objectpurger.h +++ b/windows/winfw/src/winfw/objectpurger.h @@ -15,4 +15,6 @@ public: static RemovalFunctor GetRemoveFiltersFunctor(); static RemovalFunctor GetRemoveAllFunctor(); + + static bool Execute(RemovalFunctor f); }; diff --git a/windows/winfw/src/winfw/winfw.cpp b/windows/winfw/src/winfw/winfw.cpp index d47139cb7d..53ec4e5301 100644 --- a/windows/winfw/src/winfw/winfw.cpp +++ b/windows/winfw/src/winfw/winfw.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "winfw.h" #include "fwcontext.h" +#include "objectpurger.h" #include "libwfp/ipaddress.h" #include <windows.h> #include <stdexcept> @@ -228,17 +229,13 @@ bool WINFW_API WinFw_Reset() { - if (nullptr == g_fwContext) - { - // - // This is OK because the practical difference between having no instance - // and having a reset instance is negligible. - // - return true; - } - try { + if (nullptr == g_fwContext) + { + return ObjectPurger::Execute(ObjectPurger::GetRemoveAllFunctor()); + } + return g_fwContext->reset(); } catch (std::exception &err) |
