summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--windows/winfw/src/winfw/sessioncontroller.cpp19
-rw-r--r--windows/winfw/src/winfw/sessioncontroller.h1
2 files changed, 20 insertions, 0 deletions
diff --git a/windows/winfw/src/winfw/sessioncontroller.cpp b/windows/winfw/src/winfw/sessioncontroller.cpp
index 76106fe55d..5105a57e5d 100644
--- a/windows/winfw/src/winfw/sessioncontroller.cpp
+++ b/windows/winfw/src/winfw/sessioncontroller.cpp
@@ -1,11 +1,13 @@
#include "stdafx.h"
#include "sessioncontroller.h"
#include "wfpobjecttype.h"
+#include "mullvadguids.h"
#include "libwfp/objectinstaller.h"
#include "libwfp/objectdeleter.h"
#include "libwfp/transaction.h"
#include "libcommon/memory.h"
#include <utility>
+#include <stdexcept>
namespace
{
@@ -55,6 +57,17 @@ bool CheckpointKeyToIndex(const std::vector<SessionRecord> &container, uint32_t
return false;
}
+void ValidateObject(const wfp::IIdentifiable &object)
+{
+ const auto registry = MullvadGuids::Registry();
+
+ if (registry.end() == registry.find(object.id()))
+ {
+ throw std::runtime_error("Attempting to install non-registered WFP object");
+ }
+}
+
+
} // anonymous namespace
SessionController::SessionController(std::unique_ptr<wfp::FilterEngine> &&engine)
@@ -90,6 +103,8 @@ bool SessionController::addProvider(wfp::ProviderBuilder &providerBuilder)
throw std::runtime_error("Cannot add provider outside transaction");
}
+ ValidateObject(providerBuilder);
+
GUID key;
auto status = wfp::ObjectInstaller::AddProvider(*m_engine, providerBuilder, &key);
@@ -109,6 +124,8 @@ bool SessionController::addSublayer(wfp::SublayerBuilder &sublayerBuilder)
throw std::runtime_error("Cannot add sublayer outside transaction");
}
+ ValidateObject(sublayerBuilder);
+
GUID key;
auto status = wfp::ObjectInstaller::AddSublayer(*m_engine, sublayerBuilder, &key);
@@ -128,6 +145,8 @@ bool SessionController::addFilter(wfp::FilterBuilder &filterBuilder, const wfp::
throw std::runtime_error("Cannot add filter outside transaction");
}
+ ValidateObject(filterBuilder);
+
UINT64 id;
auto status = wfp::ObjectInstaller::AddFilter(*m_engine, filterBuilder, conditionBuilder, &id);
diff --git a/windows/winfw/src/winfw/sessioncontroller.h b/windows/winfw/src/winfw/sessioncontroller.h
index 61163533c4..690bdbbc63 100644
--- a/windows/winfw/src/winfw/sessioncontroller.h
+++ b/windows/winfw/src/winfw/sessioncontroller.h
@@ -3,6 +3,7 @@
#include "iobjectinstaller.h"
#include "sessionrecord.h"
#include "libwfp/filterengine.h"
+#include "libwfp/iidentifiable.h"
#include <atomic>
#include <memory>
#include <vector>