From ed5a9ea103a1fc15f43be39aa15a2a20a5636166 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Thu, 25 May 2023 16:48:33 +0200 Subject: [PATCH] Downtime: enforce positive duration A negative duration would crash Icinga DB and doesn't make sense. Existing Downtimes with a so small duration disappear immediately - can't be broken. --- lib/icinga/downtime.cpp | 8 ++++++++ lib/icinga/downtime.hpp | 1 + lib/icinga/scheduleddowntime.cpp | 8 ++++++++ lib/icinga/scheduleddowntime.hpp | 1 + 4 files changed, 18 insertions(+) diff --git a/lib/icinga/downtime.cpp b/lib/icinga/downtime.cpp index 98a65d417..f9d4f5acc 100644 --- a/lib/icinga/downtime.cpp +++ b/lib/icinga/downtime.cpp @@ -583,6 +583,14 @@ void Downtime::ValidateEndTime(const Lazy& lvalue, const ValidationUt BOOST_THROW_EXCEPTION(ValidationError(this, { "end_time" }, "End time must be greater than 0.")); } +void Downtime::ValidateDuration(const Lazy& lvalue, const ValidationUtils& utils) +{ + ObjectImpl::ValidateDuration(lvalue, utils); + + if (lvalue() < 0) + BOOST_THROW_EXCEPTION(ValidationError(this, { "duration" }, "Duration must be positive.")); +} + DowntimeChildOptions Downtime::ChildOptionsFromValue(const Value& options) { if (options == "DowntimeNoChildren") diff --git a/lib/icinga/downtime.hpp b/lib/icinga/downtime.hpp index 8be69826f..661a4dca5 100644 --- a/lib/icinga/downtime.hpp +++ b/lib/icinga/downtime.hpp @@ -84,6 +84,7 @@ protected: void ValidateStartTime(const Lazy& lvalue, const ValidationUtils& utils) override; void ValidateEndTime(const Lazy& lvalue, const ValidationUtils& utils) override; + void ValidateDuration(const Lazy& lvalue, const ValidationUtils& utils) override; private: ObjectImpl::Ptr m_Checkable; diff --git a/lib/icinga/scheduleddowntime.cpp b/lib/icinga/scheduleddowntime.cpp index f9ddc4385..a4569d46d 100644 --- a/lib/icinga/scheduleddowntime.cpp +++ b/lib/icinga/scheduleddowntime.cpp @@ -88,6 +88,14 @@ void ScheduledDowntime::Start(bool runtimeCreated) Utility::QueueAsyncCallback([this]() { CreateNextDowntime(); }); } +void ScheduledDowntime::ValidateDuration(const Lazy& lvalue, const ValidationUtils& utils) +{ + ObjectImpl::ValidateDuration(lvalue, utils); + + if (lvalue() < 0) + BOOST_THROW_EXCEPTION(ValidationError(this, { "duration" }, "Duration must be positive.")); +} + void ScheduledDowntime::TimerProc() { for (const ScheduledDowntime::Ptr& sd : ConfigType::GetObjectsByType()) { diff --git a/lib/icinga/scheduleddowntime.hpp b/lib/icinga/scheduleddowntime.hpp index e70123616..ab636d8ea 100644 --- a/lib/icinga/scheduleddowntime.hpp +++ b/lib/icinga/scheduleddowntime.hpp @@ -40,6 +40,7 @@ public: protected: void OnAllConfigLoaded() override; void Start(bool runtimeCreated) override; + void ValidateDuration(const Lazy& lvalue, const ValidationUtils& utils) override; private: static void TimerProc();