From 9973ea165fd7f21cf6d326c658fc99f16bba7fdb Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Wed, 30 Jan 2019 10:22:23 +0100 Subject: [PATCH] - MMS server: fixed problem in read with component access --- src/mms/iso_mms/asn1c/constr_SET_OF.c | 3 +- src/mms/iso_mms/server/mms_read_service.c | 65 +++++++++++++---------- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/mms/iso_mms/asn1c/constr_SET_OF.c b/src/mms/iso_mms/asn1c/constr_SET_OF.c index e183de47..801abc91 100644 --- a/src/mms/iso_mms/asn1c/constr_SET_OF.c +++ b/src/mms/iso_mms/asn1c/constr_SET_OF.c @@ -837,6 +837,7 @@ SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr, return 0; } +#if 0 asn_dec_rval_t SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { @@ -909,4 +910,4 @@ SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, rv.consumed = 0; return rv; } - +#endif diff --git a/src/mms/iso_mms/server/mms_read_service.c b/src/mms/iso_mms/server/mms_read_service.c index caee6785..92361423 100644 --- a/src/mms/iso_mms/server/mms_read_service.c +++ b/src/mms/iso_mms/server/mms_read_service.c @@ -156,7 +156,7 @@ isAccessToArrayComponent(AlternateAccess_t* alternateAccess) } static MmsValue* -getComponent(AlternateAccess_t* alternateAccess, MmsVariableSpecification* namedVariable, MmsValue* variableValue) +getComponent(MmsServerConnection connection, MmsDomain* domain, AlternateAccess_t* alternateAccess, MmsVariableSpecification* namedVariable, char* variableName) { MmsValue* retValue = NULL; @@ -171,33 +171,39 @@ getComponent(AlternateAccess_t* alternateAccess, MmsVariableSpecification* named int i; - for (i = 0; i < namedVariable->typeSpec.structure.elementCount; - i++) { + for (i = 0; i < namedVariable->typeSpec.structure.elementCount; i++) { - if (strlen(namedVariable->typeSpec.structure.elements[i]->name) + if ((int) strlen(namedVariable->typeSpec.structure.elements[i]->name) == component.size) { - if (strncmp( - namedVariable->typeSpec.structure.elements[i]->name, - (char*) component.buf, component.size) == 0) { - MmsValue* value = MmsValue_getElement(variableValue, i); - - if (alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess - != NULL) { - retValue = - getComponent( - alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess, - namedVariable->typeSpec.structure.elements[i], - value); + if (!strncmp(namedVariable->typeSpec.structure.elements[i]->name, + (char*) component.buf, component.size)) + { + if (strlen(variableName) + component.size < 199) { + + strcat(variableName, "$"); + strncat(variableName, (const char*) component.buf, component.size); + + + if (alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess + != NULL) { + retValue = + getComponent(connection, domain, + alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess, + namedVariable->typeSpec.structure.elements[i], + variableName); + } + else { + retValue = mmsServer_getValue(connection->server, domain, variableName, connection); + } } - else - retValue = value; } } } } } - exit_function: return retValue; +exit_function: + return retValue; } static MmsValue* @@ -226,7 +232,7 @@ getComponentOfArrayElement(AlternateAccess_t* alternateAccess, MmsVariableSpecif int i; for (i = 0; i < structSpec->typeSpec.structure.elementCount; i++) { - if (strlen(structSpec->typeSpec.structure.elements[i]->name) + if ((int) strlen(structSpec->typeSpec.structure.elements[i]->name) == component.size) { if (strncmp(structSpec->typeSpec.structure.elements[i]->name, (char*) component.buf, component.size) == 0) { @@ -341,14 +347,19 @@ addNamedVariableToResultList(MmsVariableSpecification* namedVariable, MmsDomain* MmsValue* value = mmsServer_getValue(connection->server, domain, nameIdStr, connection); if (alternateAccess != NULL) { - value = getComponent(alternateAccess, namedVariable, value); - if (value != NULL) { - appendValueToResultList(value, values); - } - else { - appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT); - } + char variableName[200]; + variableName[0] = 0; + strcat(variableName, nameIdStr); + + value = getComponent(connection, domain, alternateAccess, namedVariable, variableName); + + if (value != NULL) { + appendValueToResultList(value, values); + } + else { + appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT); + } } else { if (value != NULL) {