From 98ac02a85b9d9973cc44303d1b68e04ca95cff9c Mon Sep 17 00:00:00 2001 From: Philipp Jungkamp Date: Tue, 14 Mar 2023 15:44:51 +0000 Subject: [PATCH] node-iec61850-goose: log error instead of crashing on unsupported mms value Signed-off-by: Philipp Jungkamp --- include/villas/nodes/iec61850_goose.hpp | 2 +- lib/nodes/iec61850_goose.cpp | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/include/villas/nodes/iec61850_goose.hpp b/include/villas/nodes/iec61850_goose.hpp index 98193ab62..16502c130 100644 --- a/include/villas/nodes/iec61850_goose.hpp +++ b/include/villas/nodes/iec61850_goose.hpp @@ -124,7 +124,7 @@ protected: SubscriberConfig subscriber_config; GooseNode *node; - std::vector values; + std::vector> values; int last_state_num; }; diff --git a/lib/nodes/iec61850_goose.cpp b/lib/nodes/iec61850_goose.cpp index cd79fcc04..54866b8d0 100644 --- a/lib/nodes/iec61850_goose.cpp +++ b/lib/nodes/iec61850_goose.cpp @@ -261,7 +261,7 @@ void GooseNode::onEvent(GooseSubscriber subscriber, GooseNode::InputEventContext for (unsigned int i = 0; i < MmsValue_getArraySize(mms_values); i++) { auto mms_value = MmsValue_getElement(mms_values, i); - auto goose_value = GooseSignal::fromMmsValue(mms_value).value(); + auto goose_value = GooseSignal::fromMmsValue(mms_value); ctx.values.push_back(goose_value); } @@ -292,15 +292,19 @@ void GooseNode::pushSample(uint64_t timestamp) noexcept auto& mapping = input.mappings[signal]; auto& values = input.contexts[mapping.subscriber].values; - if (mapping.index >= values.size()) - continue; - - if (mapping.type->mms_type != values[mapping.index].mmsType()) { - logger->error("unexpected mms_type for signal {}", sample->signals->getByIndex(signal)->toString()); + if (mapping.index >= values.size() || !values[mapping.index]) { + auto signal_str = sample->signals->getByIndex(signal)->toString(); + logger->error("tried to access unavailable goose value for signal {}", signal_str); continue; } - sample->data[signal] = values[mapping.index].signal_data; + if (mapping.type->mms_type != values[mapping.index]->mmsType()) { + auto signal_str = sample->signals->getByIndex(signal)->toString(); + logger->error("unexpected mms_type for signal {}", signal_str); + continue; + } + + sample->data[signal] = values[mapping.index]->signal_data; } if (queue_signalled_push(&input.queue, sample) != 1)