From 22f6a823eae42ff2a291c944d4901b0a47aa3509 Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 10 Jun 2022 13:08:15 +0200 Subject: [PATCH] - changed StringUtils_createStringInBuffer function to consider max buffer size (LIB61850-333) --- src/common/inc/string_utilities.h | 2 +- src/common/string_utilities.c | 23 +++++----- src/iec61850/common/iec61850_common.c | 3 -- .../inc_private/ied_connection_private.h | 5 +-- src/iec61850/server/impl/ied_server.c | 7 ++- src/iec61850/server/mms_mapping/control.c | 44 +++++++++---------- src/iec61850/server/mms_mapping/mms_sv.c | 2 +- src/iec61850/server/model/model.c | 2 +- src/mms/iso_mms/server/mms_read_service.c | 2 +- 9 files changed, 44 insertions(+), 46 deletions(-) diff --git a/src/common/inc/string_utilities.h b/src/common/inc/string_utilities.h index 4593ec28..b6b238ff 100644 --- a/src/common/inc/string_utilities.h +++ b/src/common/inc/string_utilities.h @@ -55,7 +55,7 @@ StringUtils_createString(int count, ...); * to concatenate. */ LIB61850_INTERNAL char* -StringUtils_createStringInBuffer(char* buffer, int count, ...); +StringUtils_createStringInBuffer(char* newStr, int bufSize, int count, ...); LIB61850_INTERNAL char* StringUtils_createStringFromBuffer(const uint8_t* buf, int size); diff --git a/src/common/string_utilities.c b/src/common/string_utilities.c index aa2149d5..dfb9d620 100644 --- a/src/common/string_utilities.c +++ b/src/common/string_utilities.c @@ -85,23 +85,22 @@ StringUtils_createStringFromBufferInBuffer(char* newString, const uint8_t* buf, return newString; } - char* -StringUtils_createStringInBuffer(char* newStr, int count, ...) +StringUtils_createStringInBuffer(char* newStr, int bufSize, int count, ...) { va_list ap; - char* currentPos = newStr; - int i; - va_start(ap, count); - for (i = 0; i < count; i++) { - char* str = va_arg(ap, char*); - strcpy(currentPos, str); - currentPos += strlen(str); - } - va_end(ap); + if (bufSize > 0) { + newStr[0] = 0; + int i; - *currentPos = 0; + va_start(ap, count); + for (i = 0; i < count; i++) { + char* str = va_arg(ap, char*); + StringUtils_appendString(newStr, bufSize, str); + } + va_end(ap); + } return newStr; } diff --git a/src/iec61850/common/iec61850_common.c b/src/iec61850/common/iec61850_common.c index c4db33c6..60c1b789 100644 --- a/src/iec61850/common/iec61850_common.c +++ b/src/iec61850/common/iec61850_common.c @@ -592,11 +592,8 @@ MmsMapping_createMmsVariableNameFromObjectReference(const char* objectReference, else i++; - if (fc == IEC61850_FC_NONE) { - int len = objRefLength - i; - char* mmsVariableName; if (buffer == NULL) diff --git a/src/iec61850/inc_private/ied_connection_private.h b/src/iec61850/inc_private/ied_connection_private.h index aefc2168..619da24c 100644 --- a/src/iec61850/inc_private/ied_connection_private.h +++ b/src/iec61850/inc_private/ied_connection_private.h @@ -28,6 +28,8 @@ #define DEBUG_IED_CLIENT 0 #endif +#include "iec61850_common_internal.h" + #include "hal_thread.h" typedef struct sIedConnectionOutstandingCall* IedConnectionOutstandingCall; @@ -145,9 +147,6 @@ ControlObjectClient_setLastApplError(ControlObjectClient self, LastApplError las /* some declarations that are shared with server side ! */ -LIB61850_INTERNAL char* -MmsMapping_getMmsDomainFromObjectReference(const char* objectReference, char* buffer); - LIB61850_INTERNAL char* MmsMapping_createMmsVariableNameFromObjectReference(const char* objectReference, FunctionalConstraint fc, char* buffer); diff --git a/src/iec61850/server/impl/ied_server.c b/src/iec61850/server/impl/ied_server.c index 927c1181..1b804071 100644 --- a/src/iec61850/server/impl/ied_server.c +++ b/src/iec61850/server/impl/ied_server.c @@ -210,7 +210,7 @@ createMmsServerCache(IedServer self) { char variableName[65]; - StringUtils_createStringInBuffer(variableName, 3, lnName, "$", fcName); + StringUtils_createStringInBuffer(variableName, 65, 3, lnName, "$", fcName); MmsValue* defaultValue = MmsValue_newDefaultValue(fcSpec); @@ -245,10 +245,13 @@ installDefaultValuesForDataAttribute(IedServer self, DataAttribute* dataAttribut MmsMapping_createMmsVariableNameFromObjectReference(objectReference, dataAttribute->fc, mmsVariableName); char domainName[65]; + char ldName[65]; StringUtils_copyStringMax(domainName, 65, self->model->name); - MmsMapping_getMmsDomainFromObjectReference(objectReference, domainName + strlen(domainName)); + MmsMapping_getMmsDomainFromObjectReference(objectReference, ldName); + + StringUtils_appendString(domainName, 65, ldName); MmsDomain* domain = MmsDevice_getDomain(self->mmsDevice, domainName); diff --git a/src/iec61850/server/mms_mapping/control.c b/src/iec61850/server/mms_mapping/control.c index 9dac09dd..dac37559 100644 --- a/src/iec61850/server/mms_mapping/control.c +++ b/src/iec61850/server/mms_mapping/control.c @@ -1006,9 +1006,9 @@ ControlObject_initialize(ControlObject* self) emptyString.value.visibleString.buf = NULL; } - char strBuf[129]; + char strBuf[130]; - char* ctlModelName = StringUtils_createStringInBuffer(strBuf, 4, self->lnName, "$CF$", self->name, "$ctlModel"); + char* ctlModelName = StringUtils_createStringInBuffer(strBuf, 130, 4, self->lnName, "$CF$", self->name, "$ctlModel"); if (DEBUG_IED_SERVER) printf("IED_SERVER: initialize control for %s\n", ctlModelName); @@ -1021,33 +1021,33 @@ ControlObject_initialize(ControlObject* self) printf("IED_SERVER: No control model found for variable %s\n", ctlModelName); } - char* sboClassName = StringUtils_createStringInBuffer(strBuf, 4, self->lnName, "$CF$", self->name, "$sboClass"); + char* sboClassName = StringUtils_createStringInBuffer(strBuf, 130, 4, self->lnName, "$CF$", self->name, "$sboClass"); self->sboClass = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, sboClassName); - char* ctlNumName = StringUtils_createStringInBuffer(strBuf, 4, self->lnName, "$ST$", self->name, "$ctlNum"); + char* ctlNumName = StringUtils_createStringInBuffer(strBuf, 130, 4, self->lnName, "$ST$", self->name, "$ctlNum"); self->ctlNumSt = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, ctlNumName); if (self->ctlNumSt == NULL) { /* for APC */ - ctlNumName = StringUtils_createStringInBuffer(strBuf, 4, self->lnName, "$MX$", self->name, "$ctlNum"); + ctlNumName = StringUtils_createStringInBuffer(strBuf, 130, 4, self->lnName, "$MX$", self->name, "$ctlNum"); self->ctlNumSt = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, ctlNumName); } - char* originName = StringUtils_createStringInBuffer(strBuf, 4, self->lnName, "$ST$", self->name, "$origin"); + char* originName = StringUtils_createStringInBuffer(strBuf, 130, 4, self->lnName, "$ST$", self->name, "$origin"); self->originSt = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, originName); if (self->originSt == NULL) { /* for APC */ - originName = StringUtils_createStringInBuffer(strBuf, 4, self->lnName, "$MX$", self->name, "$origin"); + originName = StringUtils_createStringInBuffer(strBuf, 130, 4, self->lnName, "$MX$", self->name, "$origin"); self->originSt = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, originName); } - char* sboTimeoutName = StringUtils_createStringInBuffer(strBuf, 4, self->lnName, "$CF$", self->name, "$sboTimeout"); + char* sboTimeoutName = StringUtils_createStringInBuffer(strBuf, 130, 4, self->lnName, "$CF$", self->name, "$sboTimeout"); self->sboTimeout = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, sboTimeoutName); @@ -1055,7 +1055,7 @@ ControlObject_initialize(ControlObject* self) updateSboTimeoutValue(self); if (self->sbo) { - char* controlObjectReference = StringUtils_createStringInBuffer(strBuf, 5, self->mmsDomain->domainName, + char* controlObjectReference = StringUtils_createStringInBuffer(strBuf, 130, 5, self->mmsDomain->domainName, "/", self->lnName, "$CO$", self->name); MmsValue_setVisibleString(self->sbo, controlObjectReference); @@ -1072,35 +1072,35 @@ ControlObject_initialize(ControlObject* self) DataAttributeType stValType = IEC61850_UNKNOWN_TYPE; DataAttributeType mxValType = IEC61850_UNKNOWN_TYPE; - daName = StringUtils_createStringInBuffer(strBuf, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".Oper.ctlVal"); + daName = StringUtils_createStringInBuffer(strBuf, 130, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".Oper.ctlVal"); da = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, daName); if (da) { ctlValType = da->type; } - daName = StringUtils_createStringInBuffer(strBuf, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".stVal"); + daName = StringUtils_createStringInBuffer(strBuf, 130, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".stVal"); da = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, daName); if (da) { stValType = da->type; } - daName = StringUtils_createStringInBuffer(strBuf, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".mxVal.f"); + daName = StringUtils_createStringInBuffer(strBuf, 130, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".mxVal.f"); da = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, daName); if (da) { mxValType = da->type; } - daName = StringUtils_createStringInBuffer(strBuf, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".mxVal.i"); + daName = StringUtils_createStringInBuffer(strBuf, 130, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".mxVal.i"); da = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, daName); if (da) { mxValType = da->type; } - daName = StringUtils_createStringInBuffer(strBuf, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".valWTr"); + daName = StringUtils_createStringInBuffer(strBuf, 130, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".valWTr"); da = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, daName); if (da) { @@ -1151,7 +1151,7 @@ ControlObject_initialize(ControlObject* self) } #endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */ - char* stSeldName = StringUtils_createStringInBuffer(strBuf, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".stSeld"); + char* stSeldName = StringUtils_createStringInBuffer(strBuf, 130, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".stSeld"); self->stSeld = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, stSeldName); @@ -1162,7 +1162,7 @@ ControlObject_initialize(ControlObject* self) printf("IED_SERVER: ERROR - stSeld of wrong type!\n"); } - char* opRcvdName = StringUtils_createStringInBuffer(strBuf, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".opRcvd"); + char* opRcvdName = StringUtils_createStringInBuffer(strBuf, 130, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".opRcvd"); self->opRcvd = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, opRcvdName); @@ -1173,7 +1173,7 @@ ControlObject_initialize(ControlObject* self) printf("IED_SERVER: ERROR - opRcvd of wrong type!\n"); } - char* opOkName = StringUtils_createStringInBuffer(strBuf, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".opOk"); + char* opOkName = StringUtils_createStringInBuffer(strBuf, 130, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".opOk"); self->opOk = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, opOkName); @@ -1184,7 +1184,7 @@ ControlObject_initialize(ControlObject* self) printf("IED_SERVER: ERROR - opOk of wrong type!\n"); } - char* tOpOkName = StringUtils_createStringInBuffer(strBuf, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".tOpOk"); + char* tOpOkName = StringUtils_createStringInBuffer(strBuf, 130, 6, self->mmsDomain->domainName, "/", self->lnName, ".", self->name, ".tOpOk"); self->tOpOk = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, tOpOkName); @@ -1547,7 +1547,7 @@ ControlObject_sendCommandTerminationPositive(ControlObject* self) { char itemId[68]; /* 64 characters + space for FC + separator + string terminator */ - StringUtils_createStringInBuffer(itemId, 4, self->lnName, "$CO$", self->name, "$Oper"); + StringUtils_createStringInBuffer(itemId, 68, 4, self->lnName, "$CO$", self->name, "$Oper"); if (DEBUG_IED_SERVER) printf("IED_SERVER: send CommandTermination+: %s\n", itemId); @@ -1608,7 +1608,7 @@ ControlObject_sendCommandTerminationNegative(ControlObject* self) char ctlObj[130]; - StringUtils_createStringInBuffer(ctlObj, 6, MmsDomain_getName(self->mmsDomain), "/", + StringUtils_createStringInBuffer(ctlObj, 130, 6, MmsDomain_getName(self->mmsDomain), "/", self->lnName, "$CO$", self->name, "$Oper"); MmsValue ctlObjValueMemory; @@ -1637,7 +1637,7 @@ ControlObject_sendCommandTerminationNegative(ControlObject* self) char itemId[130]; - StringUtils_createStringInBuffer(itemId, 4, self->lnName, "$CO$", self->name, "$Oper"); + StringUtils_createStringInBuffer(itemId, 130, 4, self->lnName, "$CO$", self->name, "$Oper"); char* domainId = MmsDomain_getName(self->mmsDomain); @@ -1678,7 +1678,7 @@ ControlObject_sendLastApplError(ControlObject* self, MmsServerConnection connect char ctlObj[130]; - StringUtils_createStringInBuffer(ctlObj, 7, MmsDomain_getName(self->mmsDomain), "/", + StringUtils_createStringInBuffer(ctlObj, 130, 7, MmsDomain_getName(self->mmsDomain), "/", self->lnName, "$CO$", self->name, "$", ctlVariable); if (DEBUG_IED_SERVER) { diff --git a/src/iec61850/server/mms_mapping/mms_sv.c b/src/iec61850/server/mms_mapping/mms_sv.c index 40eef3dd..a03652f1 100644 --- a/src/iec61850/server/mms_mapping/mms_sv.c +++ b/src/iec61850/server/mms_mapping/mms_sv.c @@ -373,7 +373,7 @@ createSVControlBlockMmsStructure(char* gcbName, bool isUnicast) static void createDataSetReference(char* buffer, char* domainName, char* lnName, char* dataSetName) { - StringUtils_createStringInBuffer(buffer, 5, domainName, "/", lnName, "$", dataSetName); + StringUtils_createStringInBuffer(buffer, 130, 5, domainName, "/", lnName, "$", dataSetName); } void diff --git a/src/iec61850/server/model/model.c b/src/iec61850/server/model/model.c index 442ab2a7..abac9896 100644 --- a/src/iec61850/server/model/model.c +++ b/src/iec61850/server/model/model.c @@ -435,7 +435,7 @@ LogicalNode_getDataSet(LogicalNode* self, const char* dataSetName) goto exit_error; } - StringUtils_createStringInBuffer(dsName, 3, self->name, "$", dataSetName); + StringUtils_createStringInBuffer(dsName, 66, 3, self->name, "$", dataSetName); IedModel* iedModel = (IedModel*) ld->parent; diff --git a/src/mms/iso_mms/server/mms_read_service.c b/src/mms/iso_mms/server/mms_read_service.c index 4069e25e..1a658de4 100644 --- a/src/mms/iso_mms/server/mms_read_service.c +++ b/src/mms/iso_mms/server/mms_read_service.c @@ -68,7 +68,7 @@ addNamedVariableValue(MmsVariableSpecification* namedVariable, MmsServerConnecti for (i = 0; i < componentCount; i++) { char newNameIdStr[65]; - StringUtils_createStringInBuffer(newNameIdStr, 3, itemId, "$", + StringUtils_createStringInBuffer(newNameIdStr, 65, 3, itemId, "$", namedVariable->typeSpec.structure.elements[i]->name); MmsValue* element =