From 1072d54f1328654d8290800ac3303fc71b834ead Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Sat, 4 Nov 2023 07:43:30 +0000 Subject: [PATCH] - fixed - IEC 61580 server: dataset is not released when RCB.Datset is set to empty string by client (LIB61850-425) --- src/iec61850/server/mms_mapping/reporting.c | 32 ++++++++++++--------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index cba98b86..9e37cee3 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -685,9 +685,23 @@ updateReportDataset(MmsMapping* mapping, ReportControl* rc, MmsValue* newDatSet, success = true; dataSetValue = NULL; - if (rc->buffered) { - rc->isBuffering = false; - purgeBuf(rc); + if (rc->dataSet) { + if (rc->buffered) { + rc->isBuffering = false; + purgeBuf(rc); + } + + /* delete pending events */ + deleteDataSetValuesShadowBuffer(rc); + + if (rc->isDynamicDataSet) { + if (rc->dataSet) { + MmsMapping_freeDynamicallyCreatedDataSet(rc->dataSet); + } + } + + /* release used data set */ + rc->dataSet = NULL; } } else @@ -700,7 +714,6 @@ updateReportDataset(MmsMapping* mapping, ReportControl* rc, MmsValue* newDatSet, /* check if old and new data sets are the same */ if (rc->dataSet && dataSetValue) { - const char* dataSetLdName = rc->dataSet->logicalDeviceName; const char* dataSetName = rc->dataSet->name; const char* newDataSetName = MmsValue_toString(dataSetValue); @@ -737,16 +750,7 @@ updateReportDataset(MmsMapping* mapping, ReportControl* rc, MmsValue* newDatSet, } } - if (rc->isDynamicDataSet) { - if (rc->dataSet && dataSetChanged) { - deleteDataSetValuesShadowBuffer(rc); - MmsMapping_freeDynamicallyCreatedDataSet(rc->dataSet); - rc->isDynamicDataSet = false; - rc->dataSet = NULL; - } - } - - if (dataSetValue && dataSetChanged) { + if (dataSetValue) { const char* dataSetName = MmsValue_toString(dataSetValue); DataSet* dataSet = IedModel_lookupDataSet(mapping->model, dataSetName);