From cf049071ccda3f597fb6dd543a197f6c55bee7bc Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 27 Apr 2018 12:12:27 +0200 Subject: [PATCH] - IEC 61850 server: fixed bug in report module when RCB was enabled multiple times (new in 1.2.0) --- src/iec61850/server/mms_mapping/reporting.c | 29 +++++++++++---------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 253dc1e9..c3cf4bc5 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -290,6 +290,14 @@ ReportControl_getRCBValue(ReportControl* rc, char* elementName) return NULL ; } +static inline void +clearInclusionFlags(ReportControl* reportControl) +{ + int i; + for (i = 0; i < reportControl->dataSet->elementCount; i++) + reportControl->inclusionFlags[i] = REPORT_CONTROL_NONE; +} + static void updateTimeOfEntry(ReportControl* self, uint64_t currentTime) { @@ -562,8 +570,10 @@ updateReportDataset(MmsMapping* mapping, ReportControl* rc, MmsValue* newDatSet, } } - if (dataSetChanged) - purgeBuf(rc); + if (rc->buffered) { + if (dataSetChanged) + purgeBuf(rc); + } } @@ -1396,8 +1406,8 @@ Reporting_RCBWriteAccessHandler(MmsMapping* self, ReportControl* rc, char* eleme rc->isResync = false; } else { - GLOBAL_FREEMEM(rc->inclusionFlags); - rc->inclusionFlags = NULL; + if (rc->dataSet) + clearInclusionFlags(rc); MmsValue* resv = ReportControl_getRCBValue(rc, "Resv"); MmsValue_setBoolean(resv, false); @@ -1618,11 +1628,6 @@ Reporting_deactivateReportsForConnection(MmsMapping* self, MmsServerConnection c if (rc->buffered == false) { - if (rc->inclusionField != NULL) { - MmsValue_delete(rc->inclusionField); - rc->inclusionField = NULL; - } - MmsValue* resv = ReportControl_getRCBValue(rc, "Resv"); MmsValue_setBoolean(resv, false); @@ -2042,11 +2047,7 @@ enqueueReport(ReportControl* reportControl, bool isIntegrity, bool isGI, uint64_ } } - /* clear inclusion flags */ - int i; - - for (i = 0; i < reportControl->dataSet->elementCount; i++) - reportControl->inclusionFlags[i] = REPORT_CONTROL_NONE; + clearInclusionFlags(reportControl); if (DEBUG_IED_SERVER) printf("IED_SERVER: enqueueReport: encoded %i bytes for report (estimated %i) at buffer offset %i\n",