osaf/services/saf/amf/amfd/csi.cc | 15 +++++++++------ osaf/services/saf/amf/amfd/si.cc | 19 ++++++++++++++++++- 2 files changed, 27 insertions(+), 7 deletions(-)
AMFD crashes when a user to tries to modify si rank and csi deps with empty values. Patch fixes issues by: 1)Reverting to the default value for SI rank. 2)By returning BAD_OPERATION for csi deps. diff --git a/osaf/services/saf/amf/amfd/csi.cc b/osaf/services/saf/amf/amfd/csi.cc --- a/osaf/services/saf/amf/amfd/csi.cc +++ b/osaf/services/saf/amf/amfd/csi.cc @@ -564,6 +564,14 @@ static SaAisErrorT csi_ccb_completed_mod goto done; } } else if (!strcmp(attr_mod->modAttr.attrName, "saAmfCSIDependencies")) { + //Reject replacement of CSI deps, only deletion and addition are supported. + if (attr_mod->modType == SA_IMM_ATTR_VALUES_REPLACE) { + report_ccb_validation_error(opdata, + "'%s' - replacement of CSI dependency is not supported", + opdata->objectName.value); + goto done; + + } const SaNameT *required_dn = (SaNameT*) attr_mod->modAttr.attrValues[0]; const AVD_CSI *required_csi = csi_db->find(Amf::to_string(required_dn)); @@ -626,12 +634,7 @@ static SaAisErrorT csi_ccb_completed_mod report_ccb_validation_error(opdata, "only one dep can be removed at a time"); goto done; } - } else { - report_ccb_validation_error(opdata, - "'%s' - change of CSI dependency is not supported", - opdata->objectName.value); - goto done; - } + } } else { report_ccb_validation_error(opdata, "Modification of attribute '%s' not supported", attr_mod->modAttr.attrName); diff --git a/osaf/services/saf/amf/amfd/si.cc b/osaf/services/saf/amf/amfd/si.cc --- a/osaf/services/saf/amf/amfd/si.cc +++ b/osaf/services/saf/amf/amfd/si.cc @@ -713,6 +713,7 @@ static SaAisErrorT si_ccb_completed_modi AVD_SI *si; const SaImmAttrModificationT_2 *attr_mod; int i = 0; + bool value_is_deleted; TRACE_ENTER2("CCB ID %llu, '%s'", opdata->ccbId, opdata->objectName.value); @@ -722,6 +723,16 @@ static SaAisErrorT si_ccb_completed_modi /* Modifications can only be done for these attributes. */ while ((attr_mod = opdata->param.modify.attrMods[i++]) != NULL) { const SaImmAttrValuesT_2 *attribute = &attr_mod->modAttr; + //void *value = NULL; + + if ((attr_mod->modType == SA_IMM_ATTR_VALUES_DELETE) || (attribute->attrValues == NULL)) { + /* Attribute value is deleted, revert to default value */ + value_is_deleted = true; + } else { + /* Attribute value is modified */ + value_is_deleted = false; + //value = attribute->attrValues[0]; + } if (!strcmp(attribute->attrName, "saAmfSIPrefActiveAssignments")) { if (si->sg_of_si->sg_fsm_state != AVD_SG_FSM_STABLE) { @@ -751,6 +762,9 @@ static SaAisErrorT si_ccb_completed_modi break; } } else if (!strcmp(attribute->attrName, "saAmfSIRank")) { + if (value_is_deleted == true) + continue; + SaUint32T sirank = *(SaUint32T*)attribute->attrValues[0]; if (si->saAmfSIRank == (sirank == 0 ? ~0U : sirank)) { @@ -1178,7 +1192,10 @@ static void si_ccb_apply_modify_hdlr(Ccb TRACE("Modified saAmfSINumCurrStandbyAssignments is '%u'", si->saAmfSINumCurrStandbyAssignments); si->update_ass_state(); } else if (!strcmp(attribute->attrName, "saAmfSIRank")) { - si->update_sirank(*((SaUint32T *)attr_mod->modAttr.attrValues[0])); + if (value_is_deleted == true) + si->update_sirank(0); + else + si->update_sirank(*((SaUint32T *)attr_mod->modAttr.attrValues[0])); TRACE("Modified saAmfSIRank is '%u'", si->saAmfSIRank); } else { osafassert(0); ------------------------------------------------------------------------------ New Year. New Location. New Benefits. New Data Center in Ashburn, VA. GigeNET is offering a free month of service with a new server in Ashburn. Choose from 2 high performing configs, both with 100TB of bandwidth. Higher redundancy.Lower latency.Increased capacity.Completely compliant. http://p.sf.net/sfu/gigenet _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel