From f644b8d7770c1e9c4d5b8cf96942ade9d7db0e6c Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Thu, 1 Nov 2018 08:06:34 +0100 Subject: [PATCH] - IEC 61850 client: ControlObjectClient - avoid crash when "ctlVal" is not present in "Oper", also accept "setMag" instead of "ctlVal". --- dotnet/IEC61850forCSharp/IEC61850.NET.csproj | 4 ---- src/iec61850/client/client_control.c | 23 ++++++++++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/dotnet/IEC61850forCSharp/IEC61850.NET.csproj b/dotnet/IEC61850forCSharp/IEC61850.NET.csproj index 78b3cbcd..4aa6af86 100644 --- a/dotnet/IEC61850forCSharp/IEC61850.NET.csproj +++ b/dotnet/IEC61850forCSharp/IEC61850.NET.csproj @@ -28,10 +28,6 @@ - - - - diff --git a/src/iec61850/client/client_control.c b/src/iec61850/client/client_control.c index c748d79e..f54b8460 100644 --- a/src/iec61850/client/client_control.c +++ b/src/iec61850/client/client_control.c @@ -162,8 +162,13 @@ ControlObjectClient_create(const char* objectReference, IedConnection connection ctlVal = MmsVariableSpecification_getNamedVariableRecursive(oper, "ctlVal"); - if (MmsVariableSpecification_getType(ctlVal) == MMS_STRUCTURE) - isAPC = true; + if (ctlVal == NULL) + ctlVal = MmsVariableSpecification_getNamedVariableRecursive(oper, "setMag"); + + if (ctlVal) { + if (MmsVariableSpecification_getType(ctlVal) == MMS_STRUCTURE) + isAPC = true; + } MmsVariableSpecification* operTm = MmsVariableSpecification_getNamedVariableRecursive(oper, "operTm"); @@ -211,20 +216,24 @@ ControlObjectClient_create(const char* objectReference, IedConnection connection self->analogValue = NULL; /* Check for T element type (Binary time -> Ed.1,UTC time -> Ed.2) */ - if (MmsVariableSpecification_getType(t) == MMS_BINARY_TIME) - self->edition = 1; + if (t) { + if (MmsVariableSpecification_getType(t) == MMS_BINARY_TIME) + self->edition = 1; + else + self->edition = 2; + } else - self->edition = 2; + self->edition = 1; if (DEBUG_IED_CLIENT) printf("IED_CLIENT: Detected edition %i control\n", self->edition); iedConnection_addControlClient(connection, self); - free_varspec: +free_varspec: MmsVariableSpecification_destroy(ctlVarSpec); - exit_function: +exit_function: return self; }