diff options
| -rw-r--r-- | windows/winfw/src/winfw/sessioncontroller.cpp | 19 | ||||
| -rw-r--r-- | windows/winfw/src/winfw/sessioncontroller.h | 1 |
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> |
