From 415b810abf705f6b744f09553ea6293392f484e1 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 27 Jun 2023 12:53:08 +0200 Subject: [PATCH 1/2] IcingaDB::PrepareObject(): round Notification#times.{begin,end} not to crash Go daemon The latter expects ints, not floats - not to mention strings. Luckily Icinga already enforces numeric strings so that we can cast it to number. --- lib/icingadb/icingadb-objects.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/icingadb/icingadb-objects.cpp b/lib/icingadb/icingadb-objects.cpp index 7a306c35a..9f5d2e3cc 100644 --- a/lib/icingadb/icingadb-objects.cpp +++ b/lib/icingadb/icingadb-objects.cpp @@ -1383,8 +1383,16 @@ bool IcingaDB::PrepareObject(const ConfigObject::Ptr& object, Dictionary::Ptr& a attributes->Set("timeperiod_id", GetObjectIdentifier(timeperiod)); if (notification->GetTimes()) { - attributes->Set("times_begin", notification->GetTimes()->Get("begin")); - attributes->Set("times_end",notification->GetTimes()->Get("end")); + auto begin (notification->GetTimes()->Get("begin")); + auto end (notification->GetTimes()->Get("end")); + + if (begin != Empty) { + attributes->Set("times_begin", std::round((double)begin)); + } + + if (end != Empty) { + attributes->Set("times_end", std::round((double)end)); + } } attributes->Set("notification_interval", notification->GetInterval()); From dccb678882d0676575d19c95b853f6a259f658c6 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 27 Jun 2023 11:44:14 +0200 Subject: [PATCH 2/2] IcingaDB::PrepareObject(): cut off (null) negative Notification#times.{begin,end} not to crash Go daemon At least our PostgreSQL schema enforces positive values. --- lib/icingadb/icingadb-objects.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/icingadb/icingadb-objects.cpp b/lib/icingadb/icingadb-objects.cpp index 9f5d2e3cc..f70d36a5b 100644 --- a/lib/icingadb/icingadb-objects.cpp +++ b/lib/icingadb/icingadb-objects.cpp @@ -1386,11 +1386,11 @@ bool IcingaDB::PrepareObject(const ConfigObject::Ptr& object, Dictionary::Ptr& a auto begin (notification->GetTimes()->Get("begin")); auto end (notification->GetTimes()->Get("end")); - if (begin != Empty) { + if (begin != Empty && (double)begin >= 0) { attributes->Set("times_begin", std::round((double)begin)); } - if (end != Empty) { + if (end != Empty && (double)end >= 0) { attributes->Set("times_end", std::round((double)end)); } }