- changed StringUtils_createStringInBuffer function to consider max buffer size (LIB61850-333)

pull/396/head
Michael Zillgith 3 years ago
parent 8addfc2095
commit 22f6a823ea

@ -55,7 +55,7 @@ StringUtils_createString(int count, ...);
* to concatenate. * to concatenate.
*/ */
LIB61850_INTERNAL char* LIB61850_INTERNAL char*
StringUtils_createStringInBuffer(char* buffer, int count, ...); StringUtils_createStringInBuffer(char* newStr, int bufSize, int count, ...);
LIB61850_INTERNAL char* LIB61850_INTERNAL char*
StringUtils_createStringFromBuffer(const uint8_t* buf, int size); StringUtils_createStringFromBuffer(const uint8_t* buf, int size);

@ -85,23 +85,22 @@ StringUtils_createStringFromBufferInBuffer(char* newString, const uint8_t* buf,
return newString; return newString;
} }
char* char*
StringUtils_createStringInBuffer(char* newStr, int count, ...) StringUtils_createStringInBuffer(char* newStr, int bufSize, int count, ...)
{ {
va_list ap; va_list ap;
char* currentPos = newStr;
int i;
va_start(ap, count); if (bufSize > 0) {
for (i = 0; i < count; i++) { newStr[0] = 0;
char* str = va_arg(ap, char*); int i;
strcpy(currentPos, str);
currentPos += strlen(str);
}
va_end(ap);
*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; return newStr;
} }

@ -592,11 +592,8 @@ MmsMapping_createMmsVariableNameFromObjectReference(const char* objectReference,
else else
i++; i++;
if (fc == IEC61850_FC_NONE) { if (fc == IEC61850_FC_NONE) {
int len = objRefLength - i;
char* mmsVariableName; char* mmsVariableName;
if (buffer == NULL) if (buffer == NULL)

@ -28,6 +28,8 @@
#define DEBUG_IED_CLIENT 0 #define DEBUG_IED_CLIENT 0
#endif #endif
#include "iec61850_common_internal.h"
#include "hal_thread.h" #include "hal_thread.h"
typedef struct sIedConnectionOutstandingCall* IedConnectionOutstandingCall; typedef struct sIedConnectionOutstandingCall* IedConnectionOutstandingCall;
@ -145,9 +147,6 @@ ControlObjectClient_setLastApplError(ControlObjectClient self, LastApplError las
/* some declarations that are shared with server side ! */ /* some declarations that are shared with server side ! */
LIB61850_INTERNAL char*
MmsMapping_getMmsDomainFromObjectReference(const char* objectReference, char* buffer);
LIB61850_INTERNAL char* LIB61850_INTERNAL char*
MmsMapping_createMmsVariableNameFromObjectReference(const char* objectReference, FunctionalConstraint fc, char* buffer); MmsMapping_createMmsVariableNameFromObjectReference(const char* objectReference, FunctionalConstraint fc, char* buffer);

@ -210,7 +210,7 @@ createMmsServerCache(IedServer self)
{ {
char variableName[65]; char variableName[65];
StringUtils_createStringInBuffer(variableName, 3, lnName, "$", fcName); StringUtils_createStringInBuffer(variableName, 65, 3, lnName, "$", fcName);
MmsValue* defaultValue = MmsValue_newDefaultValue(fcSpec); MmsValue* defaultValue = MmsValue_newDefaultValue(fcSpec);
@ -245,10 +245,13 @@ installDefaultValuesForDataAttribute(IedServer self, DataAttribute* dataAttribut
MmsMapping_createMmsVariableNameFromObjectReference(objectReference, dataAttribute->fc, mmsVariableName); MmsMapping_createMmsVariableNameFromObjectReference(objectReference, dataAttribute->fc, mmsVariableName);
char domainName[65]; char domainName[65];
char ldName[65];
StringUtils_copyStringMax(domainName, 65, self->model->name); 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); MmsDomain* domain = MmsDevice_getDomain(self->mmsDevice, domainName);

@ -1006,9 +1006,9 @@ ControlObject_initialize(ControlObject* self)
emptyString.value.visibleString.buf = NULL; 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) if (DEBUG_IED_SERVER)
printf("IED_SERVER: initialize control for %s\n", ctlModelName); 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); 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); 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); self->ctlNumSt = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, ctlNumName);
if (self->ctlNumSt == NULL) { if (self->ctlNumSt == NULL) {
/* for APC */ /* 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); 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); self->originSt = MmsServer_getValueFromCache(mmsServer, self->mmsDomain, originName);
if (self->originSt == NULL) { if (self->originSt == NULL) {
/* for APC */ /* 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); 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->sboTimeout = MmsServer_getValueFromCache(mmsServer,
self->mmsDomain, sboTimeoutName); self->mmsDomain, sboTimeoutName);
@ -1055,7 +1055,7 @@ ControlObject_initialize(ControlObject* self)
updateSboTimeoutValue(self); updateSboTimeoutValue(self);
if (self->sbo) { 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); "/", self->lnName, "$CO$", self->name);
MmsValue_setVisibleString(self->sbo, controlObjectReference); MmsValue_setVisibleString(self->sbo, controlObjectReference);
@ -1072,35 +1072,35 @@ ControlObject_initialize(ControlObject* self)
DataAttributeType stValType = IEC61850_UNKNOWN_TYPE; DataAttributeType stValType = IEC61850_UNKNOWN_TYPE;
DataAttributeType mxValType = 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); da = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, daName);
if (da) { if (da) {
ctlValType = da->type; 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); da = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, daName);
if (da) { if (da) {
stValType = da->type; 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); da = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, daName);
if (da) { if (da) {
mxValType = da->type; 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); da = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, daName);
if (da) { if (da) {
mxValType = da->type; 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); da = (DataAttribute*) IedModel_getModelNodeByObjectReference(self->iedServer->model, daName);
if (da) { if (da) {
@ -1151,7 +1151,7 @@ ControlObject_initialize(ControlObject* self)
} }
#endif /* (CONFIG_IEC61850_SERVICE_TRACKING == 1) */ #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); 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"); 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); 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"); 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); 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"); 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); 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 */ 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) if (DEBUG_IED_SERVER)
printf("IED_SERVER: send CommandTermination+: %s\n", itemId); printf("IED_SERVER: send CommandTermination+: %s\n", itemId);
@ -1608,7 +1608,7 @@ ControlObject_sendCommandTerminationNegative(ControlObject* self)
char ctlObj[130]; 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"); self->lnName, "$CO$", self->name, "$Oper");
MmsValue ctlObjValueMemory; MmsValue ctlObjValueMemory;
@ -1637,7 +1637,7 @@ ControlObject_sendCommandTerminationNegative(ControlObject* self)
char itemId[130]; 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); char* domainId = MmsDomain_getName(self->mmsDomain);
@ -1678,7 +1678,7 @@ ControlObject_sendLastApplError(ControlObject* self, MmsServerConnection connect
char ctlObj[130]; 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); self->lnName, "$CO$", self->name, "$", ctlVariable);
if (DEBUG_IED_SERVER) { if (DEBUG_IED_SERVER) {

@ -373,7 +373,7 @@ createSVControlBlockMmsStructure(char* gcbName, bool isUnicast)
static void static void
createDataSetReference(char* buffer, char* domainName, char* lnName, char* dataSetName) 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 void

@ -435,7 +435,7 @@ LogicalNode_getDataSet(LogicalNode* self, const char* dataSetName)
goto exit_error; goto exit_error;
} }
StringUtils_createStringInBuffer(dsName, 3, self->name, "$", dataSetName); StringUtils_createStringInBuffer(dsName, 66, 3, self->name, "$", dataSetName);
IedModel* iedModel = (IedModel*) ld->parent; IedModel* iedModel = (IedModel*) ld->parent;

@ -68,7 +68,7 @@ addNamedVariableValue(MmsVariableSpecification* namedVariable, MmsServerConnecti
for (i = 0; i < componentCount; i++) { for (i = 0; i < componentCount; i++) {
char newNameIdStr[65]; char newNameIdStr[65];
StringUtils_createStringInBuffer(newNameIdStr, 3, itemId, "$", StringUtils_createStringInBuffer(newNameIdStr, 65, 3, itemId, "$",
namedVariable->typeSpec.structure.elements[i]->name); namedVariable->typeSpec.structure.elements[i]->name);
MmsValue* element = MmsValue* element =

Loading…
Cancel
Save