From 6bebdf8a87502b0463cfeb0a87714c81a33355b9 Mon Sep 17 00:00:00 2001 From: Noah Hilverling Date: Tue, 30 Jan 2018 11:26:07 +0100 Subject: [PATCH] Add marco RequireNotNull This is used to fix a number of possible nullptr dereferences --- lib/base/array-script.cpp | 17 +++++++++++++++++ lib/base/configobject-script.cpp | 2 ++ lib/base/datetime-script.cpp | 1 + lib/base/dictionary-script.cpp | 10 ++++++++++ lib/base/function-script.cpp | 2 ++ lib/base/object-script.cpp | 3 +++ lib/base/object.cpp | 6 ++++++ lib/base/object.hpp | 4 ++++ lib/base/typetype-script.cpp | 1 + lib/icinga/checkable-script.cpp | 1 + lib/icinga/macroprocessor.cpp | 6 ++++++ lib/methods/clusterchecktask.cpp | 3 +++ lib/methods/clusterzonechecktask.cpp | 3 +++ lib/methods/dummychecktask.cpp | 3 +++ lib/methods/exceptionchecktask.cpp | 5 ++++- lib/methods/icingachecktask.cpp | 3 +++ lib/methods/nullchecktask.cpp | 7 +++++-- lib/methods/nulleventtask.cpp | 6 ++++-- lib/methods/pluginchecktask.cpp | 3 +++ lib/methods/plugineventtask.cpp | 2 ++ lib/methods/pluginnotificationtask.cpp | 3 +++ lib/methods/randomchecktask.cpp | 7 +++++-- lib/methods/timeperiodtask.cpp | 8 ++++++-- 23 files changed, 97 insertions(+), 9 deletions(-) diff --git a/lib/base/array-script.cpp b/lib/base/array-script.cpp index 3a59b7fb8..089fa3f67 100644 --- a/lib/base/array-script.cpp +++ b/lib/base/array-script.cpp @@ -30,6 +30,7 @@ static double ArrayLen() { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); return self->GetLength(); } @@ -37,6 +38,7 @@ static void ArraySet(int index, const Value& value) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); self->Set(index, value); } @@ -44,6 +46,7 @@ static Value ArrayGet(int index) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); return self->Get(index); } @@ -51,6 +54,7 @@ static void ArrayAdd(const Value& value) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); self->Add(value); } @@ -58,6 +62,7 @@ static void ArrayRemove(int index) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); self->Remove(index); } @@ -65,6 +70,7 @@ static bool ArrayContains(const Value& value) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); return self->Contains(value); } @@ -72,6 +78,7 @@ static void ArrayClear() { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); self->Clear(); } @@ -84,6 +91,7 @@ static Array::Ptr ArraySort(const std::vector& args) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); Array::Ptr arr = self->ShallowClone(); @@ -107,6 +115,7 @@ static Array::Ptr ArrayShallowClone() { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); return self->ShallowClone(); } @@ -114,6 +123,7 @@ static Value ArrayJoin(const Value& separator) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); Value result; bool first = true; @@ -136,6 +146,7 @@ static Array::Ptr ArrayReverse() { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); return self->Reverse(); } @@ -143,6 +154,7 @@ static Array::Ptr ArrayMap(const Function::Ptr& function) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); if (vframe->Sandboxed && !function->IsSideEffectFree()) BOOST_THROW_EXCEPTION(ScriptError("Map function must be side-effect free.")); @@ -161,6 +173,7 @@ static Value ArrayReduce(const Function::Ptr& function) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); if (vframe->Sandboxed && !function->IsSideEffectFree()) BOOST_THROW_EXCEPTION(ScriptError("Reduce function must be side-effect free.")); @@ -182,6 +195,7 @@ static Array::Ptr ArrayFilter(const Function::Ptr& function) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); if (vframe->Sandboxed && !function->IsSideEffectFree()) BOOST_THROW_EXCEPTION(ScriptError("Filter function must be side-effect free.")); @@ -201,6 +215,7 @@ static bool ArrayAny(const Function::Ptr& function) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); if (vframe->Sandboxed && !function->IsSideEffectFree()) BOOST_THROW_EXCEPTION(ScriptError("Filter function must be side-effect free.")); @@ -218,6 +233,7 @@ static bool ArrayAll(const Function::Ptr& function) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); if (vframe->Sandboxed && !function->IsSideEffectFree()) BOOST_THROW_EXCEPTION(ScriptError("Filter function must be side-effect free.")); @@ -234,6 +250,7 @@ static Array::Ptr ArrayUnique() { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Array::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); std::set result; diff --git a/lib/base/configobject-script.cpp b/lib/base/configobject-script.cpp index d2cdba45b..7ca590d57 100644 --- a/lib/base/configobject-script.cpp +++ b/lib/base/configobject-script.cpp @@ -29,6 +29,7 @@ static void ConfigObjectModifyAttribute(const String& attr, const Value& value) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); ConfigObject::Ptr self = vframe->Self; + RequireNotNull(self); return self->ModifyAttribute(attr, value); } @@ -36,6 +37,7 @@ static void ConfigObjectRestoreAttribute(const String& attr) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); ConfigObject::Ptr self = vframe->Self; + RequireNotNull(self); return self->RestoreAttribute(attr); } diff --git a/lib/base/datetime-script.cpp b/lib/base/datetime-script.cpp index 4a16a0aa2..1a3a40791 100644 --- a/lib/base/datetime-script.cpp +++ b/lib/base/datetime-script.cpp @@ -29,6 +29,7 @@ static String DateTimeFormat(const String& format) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); DateTime::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); return self->Format(format); } diff --git a/lib/base/dictionary-script.cpp b/lib/base/dictionary-script.cpp index 547f814b1..709e7304f 100644 --- a/lib/base/dictionary-script.cpp +++ b/lib/base/dictionary-script.cpp @@ -29,6 +29,7 @@ static double DictionaryLen() { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Dictionary::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); return self->GetLength(); } @@ -36,6 +37,7 @@ static void DictionarySet(const String& key, const Value& value) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Dictionary::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); self->Set(key, value); } @@ -43,6 +45,7 @@ static Value DictionaryGet(const String& key) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Dictionary::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); return self->Get(key); } @@ -50,6 +53,7 @@ static void DictionaryRemove(const String& key) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Dictionary::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); self->Remove(key); } @@ -57,6 +61,7 @@ static bool DictionaryContains(const String& key) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Dictionary::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); return self->Contains(key); } @@ -64,6 +69,7 @@ static Dictionary::Ptr DictionaryShallowClone() { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Dictionary::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); return self->ShallowClone(); } @@ -71,6 +77,8 @@ static Array::Ptr DictionaryKeys() { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Dictionary::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); + ArrayData keys; ObjectLock olock(self); for (const Dictionary::Pair& kv : self) { @@ -83,6 +91,8 @@ static Array::Ptr DictionaryValues() { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Dictionary::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); + ArrayData values; ObjectLock olock(self); for (const Dictionary::Pair& kv : self) { diff --git a/lib/base/function-script.cpp b/lib/base/function-script.cpp index 757eb4e2d..a11fde1c8 100644 --- a/lib/base/function-script.cpp +++ b/lib/base/function-script.cpp @@ -32,6 +32,7 @@ static Value FunctionCall(const std::vector& args) ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Function::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); std::vector uargs(args.begin() + 1, args.end()); return self->InvokeThis(args[0], uargs); @@ -41,6 +42,7 @@ static Value FunctionCallV(const Value& thisArg, const Array::Ptr& args) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Function::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); std::vector uargs; diff --git a/lib/base/object-script.cpp b/lib/base/object-script.cpp index 8c42314d6..3b198f6f7 100644 --- a/lib/base/object-script.cpp +++ b/lib/base/object-script.cpp @@ -29,6 +29,7 @@ static String ObjectToString() { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Object::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); return self->ToString(); } @@ -36,6 +37,7 @@ static void ObjectNotifyAttribute(const String& attribute) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Object::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); self->NotifyField(self->GetReflectionType()->GetFieldId(attribute)); } @@ -43,6 +45,7 @@ static Object::Ptr ObjectClone() { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Object::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); return self->Clone(); } diff --git a/lib/base/object.cpp b/lib/base/object.cpp index e81422879..007ef3eb2 100644 --- a/lib/base/object.cpp +++ b/lib/base/object.cpp @@ -290,3 +290,9 @@ void icinga::DefaultObjectFactoryCheckArgs(const std::vector& args) if (!args.empty()) BOOST_THROW_EXCEPTION(std::invalid_argument("Constructor does not take any arguments.")); } + +void icinga::RequireNotNullInternal(const intrusive_ptr& object, const char *description) +{ + if (!object) + BOOST_THROW_EXCEPTION(std::invalid_argument("Pointer must not be null: " + String(description))); +} \ No newline at end of file diff --git a/lib/base/object.hpp b/lib/base/object.hpp index bd1128f57..9904421e5 100644 --- a/lib/base/object.hpp +++ b/lib/base/object.hpp @@ -57,6 +57,10 @@ extern Value Empty; DECLARE_PTR_TYPEDEFS(klass); \ IMPL_TYPE_LOOKUP(); +#define RequireNotNull(ptr) RequireNotNullInternal(ptr, #ptr) + +void RequireNotNullInternal(const intrusive_ptr& object, const char *description); + void DefaultObjectFactoryCheckArgs(const std::vector& args); template diff --git a/lib/base/typetype-script.cpp b/lib/base/typetype-script.cpp index 0a6cfbc1d..9cef98f55 100644 --- a/lib/base/typetype-script.cpp +++ b/lib/base/typetype-script.cpp @@ -35,6 +35,7 @@ static void TypeRegisterAttributeHandler(const String& fieldName, const Function { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Type::Ptr self = static_cast(vframe->Self); + RequireNotNull(self); int fid = self->GetFieldId(fieldName); self->RegisterAttributeHandler(fid, std::bind(&InvokeAttributeHandlerHelper, callback, _1, _2)); diff --git a/lib/icinga/checkable-script.cpp b/lib/icinga/checkable-script.cpp index 5d969e3f4..e1384e2c6 100644 --- a/lib/icinga/checkable-script.cpp +++ b/lib/icinga/checkable-script.cpp @@ -30,6 +30,7 @@ static void CheckableProcessCheckResult(const CheckResult::Ptr& cr) { ScriptFrame *vframe = ScriptFrame::GetCurrentFrame(); Checkable::Ptr self = vframe->Self; + RequireNotNull(self); self->ProcessCheckResult(cr); } diff --git a/lib/icinga/macroprocessor.cpp b/lib/icinga/macroprocessor.cpp index d0c4fde8c..f4dda9a35 100644 --- a/lib/icinga/macroprocessor.cpp +++ b/lib/icinga/macroprocessor.cpp @@ -37,6 +37,9 @@ Value MacroProcessor::ResolveMacros(const Value& str, const ResolverList& resolv const MacroProcessor::EscapeCallback& escapeFn, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros, int recursionLevel) { + if (useResolvedMacros) + RequireNotNull(resolvedMacros); + Value result; if (str.IsEmpty()) @@ -436,6 +439,9 @@ Value MacroProcessor::ResolveArguments(const Value& command, const Dictionary::P const MacroProcessor::ResolverList& resolvers, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros, int recursionLevel) { + if (useResolvedMacros) + RequireNotNull(resolvedMacros); + Value resolvedCommand; if (!arguments || command.IsObjectType() || command.IsObjectType()) resolvedCommand = MacroProcessor::ResolveMacros(command, resolvers, cr, nullptr, diff --git a/lib/methods/clusterchecktask.cpp b/lib/methods/clusterchecktask.cpp index 85604dd62..b54a9ac75 100644 --- a/lib/methods/clusterchecktask.cpp +++ b/lib/methods/clusterchecktask.cpp @@ -38,6 +38,9 @@ REGISTER_SCRIPTFUNCTION_NS(Internal, ClusterCheck, &ClusterCheckTask::ScriptFunc void ClusterCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) { + RequireNotNull(checkable); + RequireNotNull(cr); + if (resolvedMacros && !useResolvedMacros) return; diff --git a/lib/methods/clusterzonechecktask.cpp b/lib/methods/clusterzonechecktask.cpp index 4bb114690..08e77b6e5 100644 --- a/lib/methods/clusterzonechecktask.cpp +++ b/lib/methods/clusterzonechecktask.cpp @@ -34,6 +34,9 @@ REGISTER_SCRIPTFUNCTION_NS(Internal, ClusterZoneCheck, &ClusterZoneCheckTask::Sc void ClusterZoneCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) { + RequireNotNull(checkable); + RequireNotNull(cr); + ApiListener::Ptr listener = ApiListener::GetInstance(); if (!listener) { diff --git a/lib/methods/dummychecktask.cpp b/lib/methods/dummychecktask.cpp index 10378e64a..32955f92c 100644 --- a/lib/methods/dummychecktask.cpp +++ b/lib/methods/dummychecktask.cpp @@ -36,6 +36,9 @@ REGISTER_SCRIPTFUNCTION_NS(Internal, DummyCheck, &DummyCheckTask::ScriptFunc, "c void DummyCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) { + RequireNotNull(checkable); + RequireNotNull(cr); + CheckCommand::Ptr commandObj = checkable->GetCheckCommand(); Host::Ptr host; diff --git a/lib/methods/exceptionchecktask.cpp b/lib/methods/exceptionchecktask.cpp index a808036de..aabeb107c 100644 --- a/lib/methods/exceptionchecktask.cpp +++ b/lib/methods/exceptionchecktask.cpp @@ -31,9 +31,12 @@ using namespace icinga; REGISTER_SCRIPTFUNCTION_NS(Internal, ExceptionCheck, &ExceptionCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); -void ExceptionCheckTask::ScriptFunc(const Checkable::Ptr& service, const CheckResult::Ptr& cr, +void ExceptionCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) { + RequireNotNull(checkable); + RequireNotNull(cr); + if (resolvedMacros && !useResolvedMacros) return; diff --git a/lib/methods/icingachecktask.cpp b/lib/methods/icingachecktask.cpp index 16f58e71d..98056d3d4 100644 --- a/lib/methods/icingachecktask.cpp +++ b/lib/methods/icingachecktask.cpp @@ -38,6 +38,9 @@ REGISTER_SCRIPTFUNCTION_NS(Internal, IcingaCheck, &IcingaCheckTask::ScriptFunc, void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) { + RequireNotNull(checkable); + RequireNotNull(cr); + CheckCommand::Ptr commandObj = checkable->GetCheckCommand(); Host::Ptr host; diff --git a/lib/methods/nullchecktask.cpp b/lib/methods/nullchecktask.cpp index 64d64b034..0e6f64142 100644 --- a/lib/methods/nullchecktask.cpp +++ b/lib/methods/nullchecktask.cpp @@ -32,9 +32,12 @@ using namespace icinga; REGISTER_SCRIPTFUNCTION_NS(Internal, NullCheck, &NullCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); -void NullCheckTask::ScriptFunc(const Checkable::Ptr& service, const CheckResult::Ptr& cr, +void NullCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) { + RequireNotNull(checkable); + RequireNotNull(cr); + if (resolvedMacros && !useResolvedMacros) return; @@ -47,5 +50,5 @@ void NullCheckTask::ScriptFunc(const Checkable::Ptr& service, const CheckResult: })); cr->SetState(ServiceOK); - service->ProcessCheckResult(cr); + checkable->ProcessCheckResult(cr); } diff --git a/lib/methods/nulleventtask.cpp b/lib/methods/nulleventtask.cpp index d37e8a7b0..ab64a2f7e 100644 --- a/lib/methods/nulleventtask.cpp +++ b/lib/methods/nulleventtask.cpp @@ -25,5 +25,7 @@ using namespace icinga; REGISTER_SCRIPTFUNCTION_NS(Internal, NullEvent, &NullEventTask::ScriptFunc, "checkable:resolvedMacros:useResolvedMacros"); -void NullEventTask::ScriptFunc(const Checkable::Ptr&, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) -{ } +void NullEventTask::ScriptFunc(const Checkable::Ptr& checkable, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) +{ + RequireNotNull(checkable); +} diff --git a/lib/methods/pluginchecktask.cpp b/lib/methods/pluginchecktask.cpp index 18928fa20..885f81fbe 100644 --- a/lib/methods/pluginchecktask.cpp +++ b/lib/methods/pluginchecktask.cpp @@ -36,6 +36,9 @@ REGISTER_SCRIPTFUNCTION_NS(Internal, PluginCheck, &PluginCheckTask::ScriptFunc, void PluginCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) { + RequireNotNull(checkable); + RequireNotNull(cr); + CheckCommand::Ptr commandObj = checkable->GetCheckCommand(); Host::Ptr host; diff --git a/lib/methods/plugineventtask.cpp b/lib/methods/plugineventtask.cpp index 48b8881c2..40cafb98e 100644 --- a/lib/methods/plugineventtask.cpp +++ b/lib/methods/plugineventtask.cpp @@ -36,6 +36,8 @@ REGISTER_SCRIPTFUNCTION_NS(Internal, PluginEvent, &PluginEventTask::ScriptFunc, void PluginEventTask::ScriptFunc(const Checkable::Ptr& checkable, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) { + RequireNotNull(checkable); + EventCommand::Ptr commandObj = checkable->GetEventCommand(); Host::Ptr host; diff --git a/lib/methods/pluginnotificationtask.cpp b/lib/methods/pluginnotificationtask.cpp index 4e98aa4fb..8566eda7f 100644 --- a/lib/methods/pluginnotificationtask.cpp +++ b/lib/methods/pluginnotificationtask.cpp @@ -39,6 +39,9 @@ void PluginNotificationTask::ScriptFunc(const Notification::Ptr& notification, const String& author, const String& comment, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) { + RequireNotNull(notification); + RequireNotNull(user); + NotificationCommand::Ptr commandObj = notification->GetCommand(); auto type = static_cast(itype); diff --git a/lib/methods/randomchecktask.cpp b/lib/methods/randomchecktask.cpp index 0f55745f9..d041b17f7 100644 --- a/lib/methods/randomchecktask.cpp +++ b/lib/methods/randomchecktask.cpp @@ -31,9 +31,12 @@ using namespace icinga; REGISTER_SCRIPTFUNCTION_NS(Internal, RandomCheck, &RandomCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros"); -void RandomCheckTask::ScriptFunc(const Checkable::Ptr& service, const CheckResult::Ptr& cr, +void RandomCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros) { + RequireNotNull(checkable); + RequireNotNull(cr); + if (resolvedMacros && !useResolvedMacros) return; @@ -58,5 +61,5 @@ void RandomCheckTask::ScriptFunc(const Checkable::Ptr& service, const CheckResul cr->SetState(static_cast(Utility::Random() % 4)); - service->ProcessCheckResult(cr); + checkable->ProcessCheckResult(cr); } diff --git a/lib/methods/timeperiodtask.cpp b/lib/methods/timeperiodtask.cpp index cc4e9b51c..a6554b3ce 100644 --- a/lib/methods/timeperiodtask.cpp +++ b/lib/methods/timeperiodtask.cpp @@ -25,14 +25,18 @@ using namespace icinga; REGISTER_SCRIPTFUNCTION_NS(Internal, EmptyTimePeriod, &TimePeriodTask::EmptyTimePeriodUpdate, "tp:begin:end"); REGISTER_SCRIPTFUNCTION_NS(Internal, EvenMinutesTimePeriod, &TimePeriodTask::EvenMinutesTimePeriodUpdate, "tp:begin:end"); -Array::Ptr TimePeriodTask::EmptyTimePeriodUpdate(const TimePeriod::Ptr&, double, double) +Array::Ptr TimePeriodTask::EmptyTimePeriodUpdate(const TimePeriod::Ptr& tp, double, double) { + RequireNotNull(tp); + Array::Ptr segments = new Array(); return segments; } -Array::Ptr TimePeriodTask::EvenMinutesTimePeriodUpdate(const TimePeriod::Ptr&, double begin, double end) +Array::Ptr TimePeriodTask::EvenMinutesTimePeriodUpdate(const TimePeriod::Ptr& tp, double begin, double end) { + RequireNotNull(tp); + ArrayData segments; for (long t = begin / 60 - 1; t * 60 < end; t++) {