osaf/services/saf/amf/amfd/csi.cc | 25 ++++++++++++++++++++----- osaf/services/saf/amf/amfd/include/sg.h | 1 - osaf/services/saf/amf/amfd/sgtype.cc | 3 ++- osaf/services/saf/amf/amfd/si.cc | 27 +++++++++++++++++++++++++-- osaf/services/saf/amf/amfd/svctype.cc | 20 ++++++++++++++++++++ osaf/services/saf/amf/amfd/util.cc | 4 ++-- 6 files changed, 69 insertions(+), 11 deletions(-)
be a typo of saAmfSGtValidSuTypes * ensure saAmfCSIDependencies is deleted in csi.cc * ensure saAmfSIActiveWeight, saAmfSIStandbyWeight, saAmfSvcDefActiveWeight and saAmfSvcDefStandbyWeight are deleted in si.cc * fix a few typos where delete is called when delete [] is required 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 @@ -44,6 +44,19 @@ rc = ncs_patricia_tree_del(&csi_db, &csi->tree_node); osafassert(rc == NCSCC_RC_SUCCESS); + + if (csi->saAmfCSIDependencies) { + AVD_CSI_DEPS *csi_dep; + AVD_CSI_DEPS *next_csi_dep; + + csi_dep = csi->saAmfCSIDependencies; + while (csi_dep != NULL) { + next_csi_dep = csi_dep->csi_dep_next; + delete csi_dep; + csi_dep = next_csi_dep; + } + } + delete csi; TRACE_LEAVE2(); } @@ -295,21 +308,23 @@ } else { /* Dependency Configured. Decide rank when adding it in si list.*/ unsigned int i; - bool found = false; + bool found; AVD_CSI_DEPS *new_csi_dep = NULL; for (i = 0; i < values_number; i++) { - if (!found) - new_csi_dep = new AVD_CSI_DEPS(); + new_csi_dep = new AVD_CSI_DEPS(); if (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCSIDependencies"), attributes, i, &new_csi_dep->csi_dep_name_value) != SA_AIS_OK) { LOG_ER("Get saAmfCSIDependencies FAILED for '%s'", csi->name.value); + // make sure we don't leak any memory if + // saAmfCSIDependencies can't be read + delete new_csi_dep; goto done; } found = csi_add_csidep(csi,new_csi_dep); + if (found == true) + delete new_csi_dep; } - if (found == true) - free (new_csi_dep); } } else { csi->rank = 1; diff --git a/osaf/services/saf/amf/amfd/include/sg.h b/osaf/services/saf/amf/amfd/include/sg.h --- a/osaf/services/saf/amf/amfd/include/sg.h +++ b/osaf/services/saf/amf/amfd/include/sg.h @@ -247,7 +247,6 @@ /******************** B.04 model *************************************************/ SaNameT *saAmfSGtValidSuTypes; /* array of DNs, size in number_su_type */ SaAmfRedundancyModelT saAmfSgtRedundancyModel; - SaNameT *saAmfStgValidSuTypes; SaBoolT saAmfSgtDefAutoRepair; SaBoolT saAmfSgtDefAutoAdjust; SaTimeT saAmfSgtDefAutoAdjustProb; diff --git a/osaf/services/saf/amf/amfd/sgtype.cc b/osaf/services/saf/amf/amfd/sgtype.cc --- a/osaf/services/saf/amf/amfd/sgtype.cc +++ b/osaf/services/saf/amf/amfd/sgtype.cc @@ -77,7 +77,7 @@ static void sgtype_delete(AVD_AMF_SG_TYPE *sg_type) { (void)ncs_patricia_tree_del(&sgtype_db, &sg_type->tree_node); - delete sg_type->saAmfStgValidSuTypes; + delete [] sg_type->saAmfSGtValidSuTypes; delete sg_type; } @@ -257,6 +257,7 @@ done: if (rc != 0) { + delete [] sgt->saAmfSGtValidSuTypes; delete sgt; sgt = NULL; } 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 @@ -338,6 +338,8 @@ si->alarm_sent = false; si->num_dependents = 0; si->tol_timer_count = 0; + si->saAmfSIActiveWeight = NULL; + si->saAmfSIStandbyWeight = NULL; return si; } @@ -377,6 +379,25 @@ avd_sg_remove_si(si->sg_of_si, si); rc = ncs_patricia_tree_del(&si_db, &si->tree_node); osafassert(rc == NCSCC_RC_SUCCESS); + + if (si->saAmfSIActiveWeight) { + unsigned int i = 0; + while (si->saAmfSIActiveWeight[i] != NULL) { + delete [] si->saAmfSIActiveWeight[i]; + ++i; + } + delete [] si->saAmfSIActiveWeight; + } + + if (si->saAmfSIStandbyWeight) { + unsigned int i = 0; + while (si->saAmfSIStandbyWeight[i] != NULL) { + delete [] si->saAmfSIStandbyWeight[i]; + ++i; + } + delete [] si->saAmfSIStandbyWeight; + } + delete si; } /** @@ -595,22 +616,24 @@ /* Optional, [0..*] */ if (immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("saAmfSIActiveWeight"), attributes, &attrValuesNumber) == SA_AIS_OK) { - si->saAmfSIActiveWeight = new char*[attrValuesNumber]; + si->saAmfSIActiveWeight = new char*[attrValuesNumber + 1]; for (i = 0; i < attrValuesNumber; i++) { si->saAmfSIActiveWeight[i] = StrDup(immutil_getStringAttr(attributes, "saAmfSIActiveWeight", i)); } + si->saAmfSIActiveWeight[i] = NULL; } else { /* TODO */ } /* Optional, [0..*] */ if (immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("saAmfSIStandbyWeight"), attributes, &attrValuesNumber) == SA_AIS_OK) { - si->saAmfSIStandbyWeight = new char*[attrValuesNumber]; + si->saAmfSIStandbyWeight = new char*[attrValuesNumber + 1]; for (i = 0; i < attrValuesNumber; i++) { si->saAmfSIStandbyWeight[i] = StrDup(immutil_getStringAttr(attributes, "saAmfSIStandbyWeight", i)); } + si->saAmfSIStandbyWeight[i] = NULL; } else { /* TODO */ } diff --git a/osaf/services/saf/amf/amfd/svctype.cc b/osaf/services/saf/amf/amfd/svctype.cc --- a/osaf/services/saf/amf/amfd/svctype.cc +++ b/osaf/services/saf/amf/amfd/svctype.cc @@ -61,6 +61,24 @@ { unsigned int rc = ncs_patricia_tree_del(&svctype_db, &svc_type->tree_node); osafassert(rc == NCSCC_RC_SUCCESS); + + if (svc_type->saAmfSvcDefActiveWeight != NULL) { + unsigned int i = 0; + while (svc_type->saAmfSvcDefActiveWeight[i] != NULL) { + delete [] svc_type->saAmfSvcDefActiveWeight[i]; + ++i; + } + delete [] svc_type->saAmfSvcDefActiveWeight; + } + + if (svc_type->saAmfSvcDefStandbyWeight != NULL) { + unsigned int i = 0; + while (svc_type->saAmfSvcDefStandbyWeight[i] != NULL) { + delete [] svc_type->saAmfSvcDefStandbyWeight[i]; + ++i; + } + delete [] svc_type->saAmfSvcDefStandbyWeight; + } delete svc_type; } @@ -77,6 +95,8 @@ memcpy(svct->name.value, dn->value, dn->length); svct->name.length = dn->length; svct->tree_node.key_info = (uint8_t *)&svct->name; + svct->saAmfSvcDefActiveWeight = NULL; + svct->saAmfSvcDefStandbyWeight = NULL; /* Optional, [0..*] */ if (immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("saAmfSvcDefActiveWeight"), attributes, &attrValuesNumber) == SA_AIS_OK) { diff --git a/osaf/services/saf/amf/amfd/util.cc b/osaf/services/saf/amf/amfd/util.cc --- a/osaf/services/saf/amf/amfd/util.cc +++ b/osaf/services/saf/amf/amfd/util.cc @@ -1655,7 +1655,7 @@ compcsi_info = susi_msg->msg_info.d2n_su_si_assign.list; susi_msg->msg_info.d2n_su_si_assign.list = compcsi_info->next; if (compcsi_info->attrs.list != NULL) { - delete(compcsi_info->attrs.list); + delete [] (compcsi_info->attrs.list); compcsi_info->attrs.list = NULL; } delete compcsi_info; @@ -1681,7 +1681,7 @@ AVSV_D2N_PG_TRACK_ACT_RSP_MSG_INFO *info = &pg_msg->msg_info.d2n_pg_track_act_rsp; if (info->mem_list.numberOfItems) - delete info->mem_list.notification; + delete [] info->mem_list.notification; info->mem_list.notification = 0; info->mem_list.numberOfItems = 0; ------------------------------------------------------------------------------ CenturyLink Cloud: The Leader in Enterprise Cloud Services. Learn Why More Businesses Are Choosing CenturyLink Cloud For Critical Workloads, Development Environments & Everything In Between. Get a Quote or Start a Free Trial Today. http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel