From dc5bd43f0fe87269275c81058df076c2f59e84a5 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sun, 5 Mar 2023 08:25:02 +0000 Subject: [PATCH] - IED server: fixed read handling in RCB access control (LIB61850-391) --- .../server_example_access_control.c | 7 +++- src/iec61850/server/mms_mapping/mms_mapping.c | 35 +++++++++++-------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/examples/server_example_access_control/server_example_access_control.c b/examples/server_example_access_control/server_example_access_control.c index dcb93d0f..2d8bde93 100644 --- a/examples/server_example_access_control/server_example_access_control.c +++ b/examples/server_example_access_control/server_example_access_control.c @@ -83,7 +83,12 @@ rcbAccessHandler(void* parameter, ReportControlBlock* rcb, ClientConnection conn { printf("RCB: %s access: %s\n", ReportControlBlock_getName(rcb), operation == RCB_EVENT_GET_PARAMETER ? "READ" : "WRITE"); - return false; + if (operation == RCB_EVENT_GET_PARAMETER) { + return true; + } + else { + return false; + } } static void diff --git a/src/iec61850/server/mms_mapping/mms_mapping.c b/src/iec61850/server/mms_mapping/mms_mapping.c index a33e31b2..a91ace26 100644 --- a/src/iec61850/server/mms_mapping/mms_mapping.c +++ b/src/iec61850/server/mms_mapping/mms_mapping.c @@ -25,6 +25,7 @@ #include "mms_mapping.h" #include "mms_mapping_internal.h" #include "mms_server_internal.h" +#include "mms_value_internal.h" #include "stack_config.h" #include "mms_goose.h" @@ -68,6 +69,8 @@ typedef struct uint64_t reservationTimeout; } SettingGroup; +static MmsValue objectAccessDenied = {MMS_DATA_ACCESS_ERROR, false, {DATA_ACCESS_ERROR_OBJECT_ACCESS_DENIED}}; + #if (CONFIG_IEC61850_CONTROL_SERVICE == 1) bool @@ -3155,31 +3158,35 @@ mmsReadHandler(void* parameter, MmsDomain* domain, char* variableId, MmsServerCo continue; if (strlen(rc->name) == variableIdLen) { - if (strncmp(variableId, rc->name, variableIdLen) == 0) { - + if (strncmp(variableId, rc->name, variableIdLen) == 0) + { char* elementName = MmsMapping_getNextNameElement(reportName); - ReportControl_readAccess(rc, self, connection, elementName); - MmsValue* value = NULL; + if (ReportControl_readAccess(rc, self, connection, elementName)) + { #if (CONFIG_MMS_THREADLESS_STACK != 1) - Semaphore_wait(rc->rcbValuesLock); + Semaphore_wait(rc->rcbValuesLock); #endif - if (elementName != NULL) - value = ReportControl_getRCBValue(rc, elementName); - else - value = rc->rcbValues; + if (elementName != NULL) + value = ReportControl_getRCBValue(rc, elementName); + else + value = rc->rcbValues; - if (value) { - value = MmsValue_clone(value); - MmsValue_setDeletableRecursive(value); - } + if (value) { + value = MmsValue_clone(value); + MmsValue_setDeletableRecursive(value); + } #if (CONFIG_MMS_THREADLESS_STACK != 1) - Semaphore_post(rc->rcbValuesLock); + Semaphore_post(rc->rcbValuesLock); #endif + } + else { + value = &objectAccessDenied; + } retValue = value;