summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOdd Stranne <odd@mullvad.net>2019-03-15 14:56:38 +0100
committerOdd Stranne <odd@mullvad.net>2019-04-04 21:18:44 +0200
commit80ab3d35449015b09378d902b731733a7db1d446 (patch)
treecea977dc220c0725d404a82c998c7cbc1ddb8e11
parent64aa30a5c7b8cf87e84eafbee253ca75dbfe5834 (diff)
downloadmullvadvpn-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.cpp14
-rw-r--r--windows/winfw/src/winfw/objectpurger.h2
-rw-r--r--windows/winfw/src/winfw/winfw.cpp15
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)