ack, I have only done code review and I think it looks ok, the comment "malloc'ed in avsv_edp_susi_asgn() " in sidb.cc is correct I guess but I couldn't directly find the related malloc.
/BR HansN -----Original Message----- From: Gary Lee [mailto:gary....@dektech.com.au] Sent: den 13 januari 2014 14:46 To: Hans Feldt; Hans Nordebäck; nagendr...@oracle.com; Gary Lee Cc: opensaf-devel@lists.sourceforge.net Subject: [PATCH 1 of 1] AMFND: errors reported by valgrind [#716] osaf/services/saf/amf/amfnd/amfnd.cc | 4 +- osaf/services/saf/amf/amfnd/cbq.cc | 4 +- osaf/services/saf/amf/amfnd/ckpt_updt.cc | 4 +- osaf/services/saf/amf/amfnd/comp.cc | 14 +- osaf/services/saf/amf/amfnd/compdb.cc | 6 +- osaf/services/saf/amf/amfnd/include/avnd_util.h | 2 + osaf/services/saf/amf/amfnd/pg.cc | 6 +- osaf/services/saf/amf/amfnd/sidb.cc | 15 +- osaf/services/saf/amf/amfnd/susm.cc | 2 +- osaf/services/saf/amf/amfnd/util.cc | 145 ++++++++++++++++++++++- 10 files changed, 169 insertions(+), 33 deletions(-) * replace call to malloc(AVSV_AMF_CBK_INFO) with new() in comp.cc, so it is in line with the rest of amfnd when allocating AVSV_AMF_CBK_INFO. This eliminates the mixing of malloc/new/delete. * add functions amf_cbk_copy() and amf_csi_attr_list_copy(), which are based on the avsv equivalent but "C++ aware". This is done to avoid mixing of malloc/new/delete when dealing with 'SaAmfProtectionGroupNotificationT' in 'AVSV_AMF_CBK_INFO'. * malloc/free are now used whenever a AVSV_ATTR_NAME_VAL structure is create or deleted. Previously, there were mixed usages of malloc/new/free/delete resulting in mismatches. * fix a few places where delete was used, instead of delete []. * in pg.cc, don't set cbk_info to NULL before deleting it. diff --git a/osaf/services/saf/amf/amfnd/amfnd.cc b/osaf/services/saf/amf/amfnd/amfnd.cc --- a/osaf/services/saf/amf/amfnd/amfnd.cc +++ b/osaf/services/saf/amf/amfnd/amfnd.cc @@ -297,7 +297,7 @@ TRACE_ENTER2("Type:%u, Hdl:%llu, Inv:%llu", cbk_info->type, cbk_info->hdl, cbk_info->inv); /* Create a callback record for storing purpose. */ - rc = avsv_amf_cbk_copy(&cbk_rec, cbk_info); + rc = amf_cbk_copy(&cbk_rec, cbk_info); if (NCSCC_RC_SUCCESS != rc) goto done; @@ -317,7 +317,7 @@ LOG_ER("Couldn't find comp %s in Inter/Ext Comp DB",cbk_info->param.hc.comp_name.value); /* free the callback info */ if (cbk_rec) - avsv_amf_cbk_free(cbk_rec); + amf_cbk_free(cbk_rec); goto done; } diff --git a/osaf/services/saf/amf/amfnd/cbq.cc b/osaf/services/saf/amf/amfnd/cbq.cc --- a/osaf/services/saf/amf/amfnd/cbq.cc +++ b/osaf/services/saf/amf/amfnd/cbq.cc @@ -704,7 +704,7 @@ /* populate the msg */ msg.type = AVND_MSG_AVA; msg.info.ava->type = AVSV_AVND_AMF_CBK_MSG; - rc = avsv_amf_cbk_copy(&msg.info.ava->info.cbk_info, rec->cbk_info); + rc = amf_cbk_copy(&msg.info.ava->info.cbk_info, rec->cbk_info); if (NCSCC_RC_SUCCESS != rc) goto done; @@ -930,7 +930,7 @@ /* free the callback info */ if (rec->cbk_info) - avsv_amf_cbk_free(rec->cbk_info); + amf_cbk_free(rec->cbk_info); /* free the record */ delete rec; diff --git a/osaf/services/saf/amf/amfnd/ckpt_updt.cc b/osaf/services/saf/amf/amfnd/ckpt_updt.cc --- a/osaf/services/saf/amf/amfnd/ckpt_updt.cc +++ b/osaf/services/saf/amf/amfnd/ckpt_updt.cc @@ -220,7 +220,7 @@ } /* free the csi attributes */ if (csi_rec->attrs.list) - delete csi_rec->attrs.list; + free(csi_rec->attrs.list); /* finally free this record */ delete csi_rec; @@ -994,7 +994,7 @@ } /* free the csi attributes */ if (csi_rec->attrs.list) - delete csi_rec->attrs.list; + free(csi_rec->attrs.list); /* finally free this record */ delete csi_rec; diff --git a/osaf/services/saf/amf/amfnd/comp.cc b/osaf/services/saf/amf/amfnd/comp.cc --- a/osaf/services/saf/amf/amfnd/comp.cc +++ b/osaf/services/saf/amf/amfnd/comp.cc @@ -1892,10 +1892,7 @@ goto done; /* allocate cbk-info memory */ - if ((0 == (cbk_info = static_cast<AVSV_AMF_CBK_INFO*>(calloc(1, sizeof(AVSV_AMF_CBK_INFO)))))) { - rc = NCSCC_RC_FAILURE; - goto done; - } + cbk_info = new AVSV_AMF_CBK_INFO(); /* fill the callback params */ switch (type) { @@ -1960,7 +1957,12 @@ /* copy the attributes */ memset(&attr, 0, sizeof(AVSV_CSI_ATTRS)); if ((SA_AMF_CSI_ADD_ONE == csi_desc.csiFlags) && (curr_csi->attrs.number != 0)) { - attr.list = new AVSV_ATTR_NAME_VAL[curr_csi->attrs.number]; + attr.list = static_cast<AVSV_ATTR_NAME_VAL*> + (calloc(curr_csi->attrs.number, sizeof(AVSV_ATTR_NAME_VAL))); + if (!attr.list) { + LOG_ER("%s: calloc FAILED", __FUNCTION__); + return NCSCC_RC_FAILURE; + } memcpy(attr.list, curr_csi->attrs.list, sizeof(AVSV_ATTR_NAME_VAL) * curr_csi->attrs.number); @@ -2022,7 +2024,7 @@ done: if ((NCSCC_RC_SUCCESS != rc) && cbk_info) - avsv_amf_cbk_free(cbk_info); + amf_cbk_free(cbk_info); TRACE_LEAVE2("%u", rc); return rc; diff --git a/osaf/services/saf/amf/amfnd/compdb.cc b/osaf/services/saf/amf/amfnd/compdb.cc --- a/osaf/services/saf/amf/amfnd/compdb.cc +++ b/osaf/services/saf/amf/amfnd/compdb.cc @@ -903,21 +903,21 @@ delete [] argv; delete [] compt->saAmfCtDefCleanupCmdArgv; - delete compt->saAmfCtRelPathAmStartCmd; + delete [] compt->saAmfCtRelPathAmStartCmd; /* Free saAmfCtDefAmStartCmdArgv[i] before freeing saAmfCtDefAmStartCmdArgv */ arg_counter = 0; while ((argv = compt->saAmfCtDefAmStartCmdArgv[arg_counter++]) != NULL) delete [] argv; delete [] compt->saAmfCtDefAmStartCmdArgv; - delete compt->saAmfCtRelPathAmStopCmd; + delete [] compt->saAmfCtRelPathAmStopCmd; /* Free saAmfCtDefAmStopCmdArgv[i] before freeing saAmfCtDefAmStopCmdArgv */ arg_counter = 0; while ((argv = compt->saAmfCtDefAmStopCmdArgv[arg_counter++]) != NULL) delete [] argv; delete [] compt->saAmfCtDefAmStopCmdArgv; - delete compt->osafAmfCtRelPathHcCmd; + delete [] compt->osafAmfCtRelPathHcCmd; arg_counter = 0; while ((argv = compt->osafAmfCtDefHcCmdArgv[arg_counter++]) != NULL) delete [] argv; diff --git a/osaf/services/saf/amf/amfnd/include/avnd_util.h b/osaf/services/saf/amf/amfnd/include/avnd_util.h --- a/osaf/services/saf/amf/amfnd/include/avnd_util.h +++ b/osaf/services/saf/amf/amfnd/include/avnd_util.h @@ -51,7 +51,9 @@ void dnd_msg_free(AVSV_DND_MSG *msg); void nda_ava_msg_free(AVSV_NDA_AVA_MSG *msg); void nda_ava_msg_content_free(AVSV_NDA_AVA_MSG *msg); +void amf_csi_attr_list_copy(SaAmfCSIAttributeListT *dattr, const +SaAmfCSIAttributeListT *sattr); void amf_csi_attr_list_free(SaAmfCSIAttributeListT *attrs); +uint32_t amf_cbk_copy(AVSV_AMF_CBK_INFO **o_dcbk, const +AVSV_AMF_CBK_INFO *scbk); void amf_cbk_free(AVSV_AMF_CBK_INFO* cbk_info); void nd2nd_avnd_msg_free(AVSV_ND2ND_AVND_MSG *msg); diff --git a/osaf/services/saf/amf/amfnd/pg.cc b/osaf/services/saf/amf/amfnd/pg.cc --- a/osaf/services/saf/amf/amfnd/pg.cc +++ b/osaf/services/saf/amf/amfnd/pg.cc @@ -769,7 +769,7 @@ if (chg_mem && m_AVND_PG_TRK_IS_CHANGES_ONLY(trk)) { /*** include only the modified member ***/ - pg_param->buf.notification = new SaAmfProtectionGroupNotificationT; + pg_param->buf.notification = new +SaAmfProtectionGroupNotificationT[1]; *pg_param->buf.notification = chg_mem->info; pg_param->buf.numberOfItems = 1; @@ -780,14 +780,12 @@ /* now send the cbk msg */ rc = avnd_pg_cbk_msg_send(cb, trk, cbk_info); - /* we will free the ckb info both in success/failure case */ - cbk_info = NULL; /* reset the is_syn flag */ trk->info.is_syn = false; if ((NCSCC_RC_SUCCESS != rc) && cbk_info) - avsv_amf_cbk_free(cbk_info); + amf_cbk_free(cbk_info); TRACE_LEAVE2("rc '%u'", rc); return rc; diff --git a/osaf/services/saf/amf/amfnd/sidb.cc b/osaf/services/saf/amf/amfnd/sidb.cc --- a/osaf/services/saf/amf/amfnd/sidb.cc +++ b/osaf/services/saf/amf/amfnd/sidb.cc @@ -852,9 +852,12 @@ * Free the memory alloced for this record. */ /* free the csi attributes */ - if (csi_rec->attrs.list) - delete csi_rec->attrs.list; - + if (csi_rec->attrs.list) { + // use of free() is required as it was + // malloc'ed in avsv_edp_susi_asgn() + free(csi_rec->attrs.list); + } + /* free the pg list TBD */ TRACE_1("Comp-CSI record deletion success, Comp=%s : CSI=%s",csi_rec->comp->name.value,csi_rec->name.value); @@ -974,9 +977,11 @@ while ((curr = siq->info.list) != 0) { siq->info.list = curr->next; if (curr->attrs.list) - delete curr->attrs.list; + free(curr->attrs.list); - delete curr; + // use of free() is required as it was + // malloc'ed in avsv_edp_susi_asgn() + free(curr); } /* free the rec */ diff --git a/osaf/services/saf/amf/amfnd/susm.cc b/osaf/services/saf/amf/amfnd/susm.cc --- a/osaf/services/saf/amf/amfnd/susm.cc +++ b/osaf/services/saf/amf/amfnd/susm.cc @@ -1032,7 +1032,7 @@ osafassert(t_csi); /* free the csi attributes */ if (t_csi->attrs.list) - delete t_csi->attrs.list; + free(t_csi->attrs.list); m_AVND_SU_SI_CSI_REC_REM(*si, *t_csi); m_AVND_COMPDB_REC_CSI_REM(*(t_csi->comp), *t_csi); diff --git a/osaf/services/saf/amf/amfnd/util.cc b/osaf/services/saf/amf/amfnd/util.cc --- a/osaf/services/saf/amf/amfnd/util.cc +++ b/osaf/services/saf/amf/amfnd/util.cc @@ -298,7 +298,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); + free(compcsi_info->attrs.list); compcsi_info->attrs.list = NULL; } delete compcsi_info; @@ -324,7 +324,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; @@ -420,7 +420,7 @@ case AVSV_AVND_AMF_CBK_MSG: if (msg->info.cbk_info) { - avsv_amf_cbk_free(msg->info.cbk_info); + amf_cbk_free(msg->info.cbk_info); msg->info.cbk_info = 0; } break; @@ -433,6 +433,50 @@ } /**************************************************************************** + Name : amf_csi_attr_list_copy + + Description : This routine copies the csi attribute list. + + Arguments : dattr - ptr to the destination csi-attr list + sattr - ptr to the src csi-attr list + + Return Values : NCSCC_RC_SUCCESS / NCSCC_RC_FAILURE + + Notes : None. +*********************************************************************** +*******/ void amf_csi_attr_list_copy(SaAmfCSIAttributeListT *dattr, + const SaAmfCSIAttributeListT *sattr) +{ + uint32_t cnt; + + if (!dattr || !sattr) + goto done; + + dattr->attr = new SaAmfCSIAttributeT[sattr->number]; + + for (cnt = 0; cnt < sattr->number; cnt++) { + /* alloc memory for attr name & value */ + size_t attrNameSize = strlen((char*)sattr->attr[cnt].attrName) + 1; + dattr->attr[cnt].attrName = new SaUint8T[attrNameSize]; + + size_t attrValueSize = strlen((char*)sattr->attr[cnt].attrValue) + 1; + dattr->attr[cnt].attrValue = new SaUint8T[attrNameSize]; + + /* copy the attr name & value */ + strncpy((char*)dattr->attr[cnt].attrName, + (char*)sattr->attr[cnt].attrName, attrNameSize); + strncpy((char*)dattr->attr[cnt].attrValue, + (char*)sattr->attr[cnt].attrValue, attrValueSize); + + /* increment the attr name-val pair cnt that is copied */ + dattr->number++; + } + +done: + return; +} + +/********************************************************************** +****** Name : amf_csi_attr_list_free Description : This routine frees the csi attribute list. @@ -452,18 +496,103 @@ /* free the attr name-val pair */ for (cnt = 0; cnt < attrs->number; cnt++) { - delete attrs->attr[cnt].attrName; - delete attrs->attr[cnt].attrValue; + delete [] attrs->attr[cnt].attrName; + delete [] attrs->attr[cnt].attrValue; } /* for */ /* finally free the attr list ptr */ if (attrs->attr) - delete attrs->attr; + delete [] attrs->attr; return; } /**************************************************************************** + Name : amf_cbk_copy + + Description : This routine copies the AMF callback info message. + + Arguments : o_dcbk - double ptr to the dest cbk-info (o/p) + scbk - ptr to the source cbk-info + + Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE. + + Notes : None +*********************************************************************** +*******/ uint32_t amf_cbk_copy(AVSV_AMF_CBK_INFO **o_dcbk, const +AVSV_AMF_CBK_INFO *scbk) { + uint32_t rc = NCSCC_RC_SUCCESS; + + if (!o_dcbk || !scbk) + return NCSCC_RC_FAILURE; + + /* allocate the dest cbk-info */ + *o_dcbk = new AVSV_AMF_CBK_INFO(); + + /* copy the common fields */ + memcpy(*o_dcbk, scbk, sizeof(AVSV_AMF_CBK_INFO)); + + switch (scbk->type) { + case AVSV_AMF_HC: + case AVSV_AMF_COMP_TERM: + case AVSV_AMF_CSI_REM: + case AVSV_AMF_PXIED_COMP_INST: + case AVSV_AMF_PXIED_COMP_CLEAN: + break; + + case AVSV_AMF_PG_TRACK: + /* memset notify buffer */ + memset(&(*o_dcbk)->param.pg_track.buf, 0, +sizeof(SaAmfProtectionGroupNotificationBufferT)); + + /* copy the notify buffer, if any */ + if (scbk->param.pg_track.buf.numberOfItems) { + (*o_dcbk)->param.pg_track.buf.notification = + new +SaAmfProtectionGroupNotificationT[scbk->param.pg_track.buf.numberOfItem +s]; + + for (SaUint32T i = 0; i < scbk->param.pg_track.buf.numberOfItems; ++i) { + (*o_dcbk)->param.pg_track.buf.notification[i] = + scbk->param.pg_track.buf.notification[i]; + } + (*o_dcbk)->param.pg_track.buf.numberOfItems = scbk->param.pg_track.buf.numberOfItems; + } + break; + + case AVSV_AMF_CSI_SET: + /* memset avsv & amf csi attr lists */ + memset(&(*o_dcbk)->param.csi_set.attrs, 0, sizeof(AVSV_CSI_ATTRS)); + memset(&(*o_dcbk)->param.csi_set.csi_desc.csiAttr, 0, +sizeof(SaAmfCSIAttributeListT)); + + /* copy the avsv csi attr list */ + if (scbk->param.csi_set.attrs.number) { + (*o_dcbk)->param.csi_set.attrs.list = static_cast<AVSV_ATTR_NAME_VAL*> + (calloc(scbk->param.csi_set.attrs.number, sizeof(AVSV_ATTR_NAME_VAL))); + if ((*o_dcbk)->param.csi_set.attrs.list == NULL) { + LOG_ER("%s: calloc FAILED", __FUNCTION__); + return NCSCC_RC_FAILURE; + } + + for (uint32_t i = 0; i < scbk->param.csi_set.attrs.number; ++i) { + (*o_dcbk)->param.csi_set.attrs.list[i] = + scbk->param.csi_set.attrs.list[i]; + } + (*o_dcbk)->param.csi_set.attrs.number = scbk->param.csi_set.attrs.number; + } + + /* copy the amf csi attr list */ + if (scbk->param.csi_set.csi_desc.csiAttr.number) { + amf_csi_attr_list_copy(&(*o_dcbk)->param.csi_set.csi_desc.csiAttr, + &scbk->param.csi_set.csi_desc.csiAttr); + } + break; + + default: + osafassert(0); + } + + return rc; +} + +/********************************************************************** +****** Name : amf_cbk_free Description : This routine frees callback information. @@ -490,13 +619,13 @@ case AVSV_AMF_PG_TRACK: /* free the notify buffer */ if (cbk_info->param.pg_track.buf.numberOfItems) - delete cbk_info->param.pg_track.buf.notification; + delete [] cbk_info->param.pg_track.buf.notification; break; case AVSV_AMF_CSI_SET: /* free the avsv csi attr list */ if (cbk_info->param.csi_set.attrs.number) - delete cbk_info->param.csi_set.attrs.list; + free(cbk_info->param.csi_set.attrs.list); /* free the amf csi attr list */ amf_csi_attr_list_free(&cbk_info->param.csi_set.csi_desc.csiAttr); ------------------------------------------------------------------------------ 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