From c9fe177a87b80a0bc6422519a32e3721a7d14e0e Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Mon, 29 Oct 2018 10:02:17 +0100 Subject: [PATCH] - IEC 61850 server: fixed potential deadlock in report processing --- src/iec61850/server/mms_mapping/reporting.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/iec61850/server/mms_mapping/reporting.c b/src/iec61850/server/mms_mapping/reporting.c index 1f5d8847..1297c2aa 100644 --- a/src/iec61850/server/mms_mapping/reporting.c +++ b/src/iec61850/server/mms_mapping/reporting.c @@ -475,8 +475,12 @@ sendReport(ReportControl* self, bool isIntegrity, bool isGI) for (i = 0; i < self->dataSet->elementCount; i++) self->inclusionFlags[i] = REPORT_CONTROL_NONE; + ReportControl_unlockNotify(self); + MmsServerConnection_sendInformationReportVMDSpecific(self->clientConnection, "RPT", reportElements, false); + ReportControl_lockNotify(self); + /* Increase sequence number */ self->sqNum++; @@ -2393,8 +2397,12 @@ sendNextReportEntry(ReportControl* self) } } + ReportControl_unlockNotify(self); + MmsServerConnection_sendInformationReportVMDSpecific(self->clientConnection, "RPT", (LinkedList) reportElements, false); + ReportControl_lockNotify(self); + /* Increase sequence number */ self->sqNum++; MmsValue_setUint32(sqNum, self->sqNum); @@ -2455,12 +2463,13 @@ processEventsForReport(ReportControl* rc, uint64_t currentTimeInMs) /* send current events in event buffer before GI report */ if (rc->triggered) { + + rc->triggered = false; + if (rc->buffered) enqueueReport(rc, false, false, currentTimeInMs); else sendReport(rc, false, false); - - rc->triggered = false; } if (rc->buffered)