Ack not tested.
Thanks, Praveen On 26-Aug-16 12:08 PM, Long HB Nguyen wrote: > osaf/libs/agents/saf/amfa/amf_agent.cc | 17 ++++++++++++++--- > osaf/libs/agents/saf/amfa/ava_hdl.cc | 16 +++++++--------- > 2 files changed, 21 insertions(+), 12 deletions(-) > > > diff --git a/osaf/libs/agents/saf/amfa/amf_agent.cc > b/osaf/libs/agents/saf/amfa/amf_agent.cc > --- a/osaf/libs/agents/saf/amfa/amf_agent.cc > +++ b/osaf/libs/agents/saf/amfa/amf_agent.cc > @@ -2457,11 +2457,18 @@ SaAisErrorT AmfAgent::ProtectionGroupTra > /* create_momory is true, so let us create the memory for the Use, > User has to free it. */ > buf->numberOfItems = rsp_buf->numberOfItems; > if (buf->numberOfItems != 0) { > + /* > + * NOTE: This buf->notification is allocated by Agent, > it's > + * added sentinel element at the end so that it helps > + * to free LongDn in > saAmfProtectionGroupNotificationFree_4 > + * Sentinel element has @.change = 0 > + */ > buf->notification = > - > static_cast<SaAmfProtectionGroupNotificationT_4*>(malloc(buf->numberOfItems * > sizeof(SaAmfProtectionGroupNotificationT_4))); > + > static_cast<SaAmfProtectionGroupNotificationT_4*>(malloc((buf->numberOfItems > + 1) * sizeof(SaAmfProtectionGroupNotificationT_4))); > if (buf->notification != NULL) { > ava_cpy_protection_group_ntf(buf->notification, > rsp_buf->notification, > buf->numberOfItems, > SA_AMF_HARS_READY_FOR_ASSIGNMENT); > + buf->notification[buf->numberOfItems].change = > static_cast<SaAmfProtectionGroupChangesT>(0); > } else { > rc = SA_AIS_ERR_NO_MEMORY; > buf->numberOfItems = 0; > @@ -2555,8 +2562,12 @@ SaAisErrorT AmfAgent::ProtectionGroupNot > > /* free memory */ > if(notification) { > - // TODO (minhchau): memleak if notification is an array > - osaf_extended_name_free(¬ification->member.compName); > + // Free LongDn until reach sentinel element > + int i = 0; > + while (notification[i].change != 0) { > + osaf_extended_name_free(¬ification[i].member.compName); > + i++; > + } > free(notification); > } > else > diff --git a/osaf/libs/agents/saf/amfa/ava_hdl.cc > b/osaf/libs/agents/saf/amfa/ava_hdl.cc > --- a/osaf/libs/agents/saf/amfa/ava_hdl.cc > +++ b/osaf/libs/agents/saf/amfa/ava_hdl.cc > @@ -680,19 +680,17 @@ uint32_t ava_hdl_cbk_rec_prc(AVSV_AMF_CB > /* copy the contents into a malloced > buffer.. appl frees it */ > buf.numberOfItems = > pg_track->buf.numberOfItems; > buf.notification = > - > static_cast<SaAmfProtectionGroupNotificationT_4*>(malloc(buf.numberOfItems * > sizeof(SaAmfProtectionGroupNotificationT_4))); > + > static_cast<SaAmfProtectionGroupNotificationT_4*>(malloc((buf.numberOfItems+1) > * sizeof(SaAmfProtectionGroupNotificationT_4))); > if (buf.notification) { > > ava_cpy_protection_group_ntf(buf.notification, pg_track->buf.notification, > > pg_track->buf.numberOfItems, SA_AMF_HARS_READY_FOR_ASSIGNMENT); > - > - /* allocate LongDn strings for > notification if any > - * then client needs to free > these LongDn string as well > + /* > + * NOTE: This buf->notification > is allocated by Agent, it's > + * added sentinel element at > the end so that it helps > + * to free LongDn in > saAmfProtectionGroupNotificationFree_4 > + * Sentinel element has > @.change = 0 > */ > - for (i=0 ; i < > buf.numberOfItems; i++) { > - > osaf_extended_name_alloc( > - > osaf_extended_name_borrow(&pg_track->buf.notification[i].member.compName), > - > &buf.notification[i].member.compName); > - } > + buf.notification[buf.numberOfItems].change > = static_cast<SaAmfProtectionGroupChangesT>(0); > TRACE("Invoking PGTrack > callback for CSIName = %s", osaf_extended_name_borrow(&pg_track->csi_name)); > > ((SaAmfCallbacksT_4*)reg_cbk)->saAmfProtectionGroupTrackCallback(&pg_track->csi_name, > > &buf, > ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel