Hi Praveen, Ack (Test only).
Thanks, Quyen -----Original Message----- From: praveen.malv...@oracle.com [mailto:praveen.malv...@oracle.com] Sent: Thursday, December 24, 2015 1:34 PM To: hans.nordeb...@ericsson.com; nagendr...@oracle.com; quyen....@dektech.com.au Cc: opensaf-devel@lists.sourceforge.net Subject: [PATCH 1 of 1] amfd: fix amfd crash during modification of comp global attributes[#1612] osaf/services/saf/amf/amfd/comptype.cc | 83 +++++++++++++++++++++++++-------- 1 files changed, 63 insertions(+), 20 deletions(-) AMFD crashes for following commands: immcfg -a saAmfNumMaxInstantiateWithoutDelay= safRdn=compGlobalAttributes,safApp=safAmfService immcfg -a saAmfNumMaxInstantiateWithDelay= safRdn=compGlobalAttributes,safApp=safAmfService immcfg -a saAmfNumMaxAmStopAttempts= safRdn=compGlobalAttributes,safApp=safAmfService immcfg -a saAmfNumMaxAmStartAttempts= safRdn=compGlobalAttributes,safApp=safAmfService immcfg -a saAmfDelayBetweenInstantiateAttempts= safRdn=compGlobalAttributes,safApp=safAmfService Patch fixes the problem by restoring the default values as per spec. diff --git a/osaf/services/saf/amf/amfd/comptype.cc b/osaf/services/saf/amf/amfd/comptype.cc --- a/osaf/services/saf/amf/amfd/comptype.cc +++ b/osaf/services/saf/amf/amfd/comptype.cc @@ -794,46 +794,89 @@ static void avd_compglobalattrs_ccb_appl { int i = 0; const SaImmAttrModificationT_2 *attrMod; + bool value_is_deleted; TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata->objectName.value); switch (opdata->operationType) { case CCBUTIL_MODIFY: while ((attrMod = opdata->param.modify.attrMods[i++]) != nullptr) { + void *value = nullptr; + + if ((attrMod->modType == SA_IMM_ATTR_VALUES_DELETE) || + (attrMod->modAttr.attrValues == nullptr)) { + /* Attribute value is deleted, revert to default value */ + value_is_deleted = true; + } else { + /* Attribute value is modified */ + value_is_deleted = false; + value = attrMod->modAttr.attrValues[0]; + } + if (!strcmp("saAmfNumMaxInstantiateWithoutDelay", attrMod->modAttr.attrName)) { + SaUint32T old_value = avd_comp_global_attrs.saAmfNumMaxInstantiateWithoutDelay; + if (value_is_deleted == true) { + //Default value as per Section 8.14 (B0401). + avd_comp_global_attrs.saAmfNumMaxInstantiateWithoutDelay = 2; + } else { + avd_comp_global_attrs.saAmfNumMaxInstantiateWithoutDelay = + *((SaUint32T *)value); + } TRACE("saAmfNumMaxInstantiateWithoutDelay modified from '%u' to '%u'", - avd_comp_global_attrs.saAmfNumMaxInstantiateWithoutDelay, - *((SaUint32T *)attrMod->modAttr.attrValues[0])); - avd_comp_global_attrs.saAmfNumMaxInstantiateWithoutDelay = - *((SaUint32T *)attrMod->modAttr.attrValues[0]); + old_value, + avd_comp_global_attrs.saAmfNumMaxInstantiateWithoutDelay); } if (!strcmp("saAmfNumMaxInstantiateWithDelay", attrMod->modAttr.attrName)) { + SaUint32T old_value = avd_comp_global_attrs.saAmfNumMaxInstantiateWithDelay; + if (value_is_deleted == true) { + //Default value as per Section 8.14 (B0401). + avd_comp_global_attrs.saAmfNumMaxInstantiateWithDelay = 0; + } else { + avd_comp_global_attrs.saAmfNumMaxInstantiateWithDelay = + *((SaUint32T *)value); + } TRACE("saAmfNumMaxInstantiateWithDelay modified from '%u' to '%u'", - avd_comp_global_attrs.saAmfNumMaxInstantiateWithDelay, - *((SaUint32T *)attrMod->modAttr.attrValues[0])); - avd_comp_global_attrs.saAmfNumMaxInstantiateWithDelay = - *((SaUint32T *)attrMod->modAttr.attrValues[0]); + old_value, + avd_comp_global_attrs.saAmfNumMaxInstantiateWithDelay); } if (!strcmp("saAmfNumMaxAmStartAttempts", attrMod->modAttr.attrName)) { + SaUint32T old_value = avd_comp_global_attrs.saAmfNumMaxAmStartAttempts; + if (value_is_deleted == true) { + //Default value as per Section 8.14 (B0401). + avd_comp_global_attrs.saAmfNumMaxAmStartAttempts = 2; + } else { + avd_comp_global_attrs.saAmfNumMaxAmStartAttempts = + *((SaUint32T *)value); + } TRACE("saAmfNumMaxAmStartAttempts modified from '%u' to '%u'", - avd_comp_global_attrs.saAmfNumMaxAmStartAttempts, - *((SaUint32T *)attrMod->modAttr.attrValues[0])); - avd_comp_global_attrs.saAmfNumMaxAmStartAttempts = - *((SaUint32T *)attrMod->modAttr.attrValues[0]); + old_value, + avd_comp_global_attrs.saAmfNumMaxAmStartAttempts); } if (!strcmp("saAmfNumMaxAmStopAttempts", attrMod->modAttr.attrName)) { + SaUint32T old_value = avd_comp_global_attrs.saAmfNumMaxAmStartAttempts; + if (value_is_deleted == true) { + //Default value as per Section 8.14 (B0401). + avd_comp_global_attrs.saAmfNumMaxAmStopAttempts = 2; + } else { + avd_comp_global_attrs.saAmfNumMaxAmStopAttempts = + *((SaUint32T *)value); + } TRACE("saAmfNumMaxAmStopAttempts modified from '%u' to '%u'", - avd_comp_global_attrs.saAmfNumMaxAmStopAttempts, - *((SaUint32T *)attrMod->modAttr.attrValues[0])); - avd_comp_global_attrs.saAmfNumMaxAmStopAttempts = - *((SaUint32T *)attrMod->modAttr.attrValues[0]); + old_value, + avd_comp_global_attrs.saAmfNumMaxAmStopAttempts); } if (!strcmp("saAmfDelayBetweenInstantiateAttempts", attrMod->modAttr.attrName)) { + SaTimeT old_value = avd_comp_global_attrs.saAmfDelayBetweenInstantiateAttempts; + if (value_is_deleted == true) { + //Default value as per Section 8.14 (B0401). + avd_comp_global_attrs.saAmfDelayBetweenInstantiateAttempts = 0; + } else { + avd_comp_global_attrs.saAmfDelayBetweenInstantiateAttempts = + *((SaTimeT*)value); + } TRACE("saAmfDelayBetweenInstantiateAttempts modified from '%llu' to '%llu'", - avd_comp_global_attrs.saAmfDelayBetweenInstantiateAttempts, - *((SaTimeT *)attrMod->modAttr.attrValues[0])); - avd_comp_global_attrs.saAmfDelayBetweenInstantiateAttempts = - *((SaTimeT *)attrMod->modAttr.attrValues[0]); + old_value, + avd_comp_global_attrs.saAmfDelayBetweenInstantiateAttempts); } } break; ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel