osaf/libs/agents/saf/imma/imma_cb.h     |    5 +
 osaf/libs/agents/saf/imma/imma_db.c     |  107 ++++++++++++++++++++++++++++++++
 osaf/libs/agents/saf/imma/imma_oi_api.c |  102 +++++++++++++-----------------
 osaf/libs/agents/saf/imma/imma_om_api.c |   11 +-
 osaf/libs/agents/saf/imma/imma_proc.c   |   64 +-----------------
 5 files changed, 168 insertions(+), 121 deletions(-)


diff --git a/osaf/libs/agents/saf/imma/imma_cb.h 
b/osaf/libs/agents/saf/imma/imma_cb.h
--- a/osaf/libs/agents/saf/imma/imma_cb.h
+++ b/osaf/libs/agents/saf/imma/imma_cb.h
@@ -36,6 +36,10 @@ struct imma_oi_ccb_record {
        struct imma_callback_info* ccbCallback;
        SaImmHandleT privateAugOmHandle; 
        SaImmAdminOwnerHandleT privateAoHandle;
+       SaStringT object;/* The  Object string from the modify/delete ccb 
operation. The object is used to obtain
+                       adminOwner when saImmOiAugmentCcbInitialize is called 
in completed-callback*/
+       SaStringT adminOwner; /* adminowner of the ccb id, assigned at 
ccb-create-callback. The adminOwner used in 
+                        saImmOiAugmentCcbInitialize is called in 
completed-callback*/
 };
 
 typedef struct imma_client_node {
@@ -197,6 +201,7 @@ int imma_oi_ccb_record_set_critical(IMMA
 int imma_oi_ccb_record_terminate(IMMA_CLIENT_NODE *cl_node, SaImmOiCcbIdT 
ccbId);
 int imma_oi_ccb_record_abort(IMMA_CLIENT_NODE *cl_node, SaImmOiCcbIdT ccbId);
 int imma_oi_ccb_record_exists(IMMA_CLIENT_NODE *cl_node, SaImmOiCcbIdT ccbId);
+struct imma_oi_ccb_record * imma_oi_ccb_record_find(IMMA_CLIENT_NODE *cl_node, 
SaImmOiCcbIdT ccbId);
 int imma_oi_ccb_record_set_error(IMMA_CLIENT_NODE *cl_node, SaImmOiCcbIdT 
ccbId, const SaStringT errorString);
 SaStringT imma_oi_ccb_record_get_error(IMMA_CLIENT_NODE *cl_node, 
SaImmOiCcbIdT ccbId);
 void imma_oi_ccb_allow_error_string(IMMA_CLIENT_NODE *cl_node, SaImmOiCcbIdT 
ccbId);
diff --git a/osaf/libs/agents/saf/imma/imma_db.c 
b/osaf/libs/agents/saf/imma/imma_db.c
--- a/osaf/libs/agents/saf/imma/imma_db.c
+++ b/osaf/libs/agents/saf/imma/imma_db.c
@@ -24,6 +24,8 @@
 *****************************************************************************/
 
 #include "imma.h"
+#include "osaf_extended_name.h"
+
 /****************************************************************************
   Name          : imma_client_tree_init
   Description   : This routine is used to initialize the client tree
@@ -273,6 +275,15 @@ int imma_oi_ccb_record_delete(IMMA_CLIEN
                        to_delete->mCcbErrorString = NULL;
                }
 
+               if(to_delete->object){
+                       free(to_delete->object);
+                       to_delete->object = NULL;
+               }
+               if(to_delete->adminOwner){
+                       free(to_delete->adminOwner);
+                       to_delete->adminOwner = NULL;
+               }
+
                free(to_delete);
                TRACE_LEAVE();
                return 1;
@@ -541,6 +552,11 @@ int imma_oi_ccb_record_note_callback(IMM
         */
 
        int rs = 0;
+       const SaImmAttrNameT admoNameAttr = SA_IMM_ATTR_ADMIN_OWNER_NAME;
+       SaImmAttrValuesT_2 **attr, **attributes = NULL;
+       SaImmAttrValuesT_2 *attrVal = NULL;
+       size_t attrDataSize = 0;
+
        struct imma_oi_ccb_record *tmp = imma_oi_ccb_record_find(cl_node, 
ccbId);
 
        if(tmp && !(tmp->isAborted)) {
@@ -553,7 +569,98 @@ int imma_oi_ccb_record_note_callback(IMM
                        rs = 1;
                }
        }
+       if(callback){
+               if(callback->type == IMMA_CALLBACK_OI_CCB_CREATE){
+                       int noOfAttributes = 0;
 
+                       /* NOTE: The code below is practically a copy of the 
code
+                          in immOm searchNext, for serving the attrValues 
structure.
+                          This code should be factored out into some common 
function.
+                        */
+                       IMMSV_ATTR_VALUES_LIST *p = callback->attrValues;
+                       int i = 0;
+                       while (p) {
+                               ++noOfAttributes;
+                               p = p->next;
+                       }
+
+                       p = callback->attrValues;
+
+
+                       if(cl_node->isImmA2fCbk) {
+                               if(noOfAttributes) {
+                                       p = p->next;  // Skip RDN. RDN is the 
first attribute
+                                       noOfAttributes--;
+                               }
+                       }
+
+                       attrDataSize = sizeof(SaImmAttrValuesT_2 *) * 
(noOfAttributes + 1);
+                       attr = calloc(1, attrDataSize); /*alloc-1 */
+                       for (; i < noOfAttributes && p; i++, p = p->next) {
+                               IMMSV_ATTR_VALUES *q = &(p->n);
+                               attr[i] = calloc(1, 
sizeof(SaImmAttrValuesT_2));        /*alloc-2 */
+                               attr[i]->attrName = malloc(q->attrName.size + 
1);       /*alloc-3 */
+                               strncpy(attr[i]->attrName, (const char 
*)q->attrName.buf, q->attrName.size + 1);
+                               attr[i]->attrName[q->attrName.size] = 0;        
/*redundant. */
+                               attr[i]->attrValuesNumber = q->attrValuesNumber;
+                               attr[i]->attrValueType = 
(SaImmValueTypeT)q->attrValueType;
+                               if (q->attrValuesNumber) {
+                                       attr[i]->attrValues =
+                                               calloc(q->attrValuesNumber, 
sizeof(SaImmAttrValueT));   /*alloc-4 */
+                                       /*alloc-5 */
+                                       attr[i]->attrValues[0] =
+                                               
imma_copyAttrValue3(q->attrValueType, &(q->attrValue));
+
+                                       if (q->attrValuesNumber > 1) {
+                                               int ix;
+                                               IMMSV_EDU_ATTR_VAL_LIST *r = 
q->attrMoreValues;
+                                               for (ix = 1; ix < 
q->attrValuesNumber; ++ix) {
+                                                       osafassert(r);
+                                                       attr[i]->attrValues[ix] 
= /*alloc-5 */
+                                                               
imma_copyAttrValue3(q->attrValueType, &(r->n));
+                                                       r = r->next;
+                                               }//for
+                                       }//if
+                               }//if
+                       }//for
+                       attr[i] = NULL; /*redundant */
+
+
+                       /* Save a copy of the attrvals pointer in the callback 
to allow
+                          saImmOiAugmentCcbInitialize to get access to the 
ccbCreateContext.
+                          We cant use callback->attrValues because it is 
partially stolen
+                          from (caused to be incomplete) in the loop above 
(see imma_copyAttrValue3).
+                        */
+
+                       callback->attrValsForCreateUc = (const 
SaImmAttrValuesT_2 **)attr;
+               }
+
+               if(callback->type == IMMA_CALLBACK_OI_CCB_CREATE && 
!(tmp->adminOwner)) {       
+                       attributes = (SaImmAttrValuesT_2 **) 
callback->attrValsForCreateUc;
+                       int i=0;
+                       while((attrVal = attributes[i++]) != NULL) {
+                               if(strcmp(admoNameAttr, attrVal->attrName)==0) {
+                                       TRACE("Found %s attribute in object 
create upcall", admoNameAttr);
+                                       break;
+                               }
+                       }
+
+                       if(!attrVal || strcmp(attrVal->attrName, admoNameAttr) 
|| (attrVal->attrValuesNumber!=1) ||
+                                       (attrVal->attrValueType != 
SA_IMM_ATTR_SASTRINGT)) {
+                               
LOG_ER("imma_oi_ccb_record_note_callback:Missmatch on attribute %s", 
admoNameAttr);
+                               abort();
+                       }
+                       tmp->adminOwner = (SaStringT) 
malloc(strlen(*(SaConstStringT*) attrVal->attrValues[0])+1); 
+                       strcpy(tmp->adminOwner, *(SaConstStringT*) 
attrVal->attrValues[0]);
+
+               } else if (((callback->type == IMMA_CALLBACK_OI_CCB_DELETE) || 
(callback->type == IMMA_CALLBACK_OI_CCB_MODIFY)) 
+                               && !(tmp->object) && !(tmp->adminOwner)){
+                       SaConstStringT tmpStr = 
osaf_extended_name_borrow(&(callback->name));
+                       tmp->object= (SaStringT) malloc(strlen(tmpStr)+1); 
+                       strcpy(tmp->object, tmpStr);
+               }
+       }
+               
        return rs;
 }
 
diff --git a/osaf/libs/agents/saf/imma/imma_oi_api.c 
b/osaf/libs/agents/saf/imma/imma_oi_api.c
--- a/osaf/libs/agents/saf/imma/imma_oi_api.c
+++ b/osaf/libs/agents/saf/imma/imma_oi_api.c
@@ -3549,8 +3549,8 @@ extern SaAisErrorT immsv_om_augment_ccb_
 
 extern SaAisErrorT immsv_om_augment_ccb_get_admo_name(
                                 SaImmHandleT privateOmHandle,
-                                SaNameT* objectName,
-                                SaNameT* admoNameOut) __attribute__((weak));
+                                SaStringT object,
+                                SaStringT * admOwnerOut) __attribute__((weak));
 
 
 extern SaAisErrorT immsv_om_handle_initialize(SaImmHandleT *privateOmHandle, 
SaVersionT* version) __attribute__((weak));
@@ -3565,52 +3565,30 @@ extern void immsv_om_handle_finalize(
                                 SaImmHandleT privateOmHandle) 
__attribute__((weak));
 
 static SaAisErrorT
-getAdmoName(SaImmHandleT privateOmHandle, IMMA_CALLBACK_INFO * cbi, SaNameT* 
admoNameOut)
+getAdmoName(SaImmHandleT privateOmHandle, IMMA_CALLBACK_INFO * cbi, SaStringT 
object, SaStringT *admOwnerOut)
 {
     SaAisErrorT rc = SA_AIS_OK;
     const SaImmAttrNameT admoNameAttr = SA_IMM_ATTR_ADMIN_OWNER_NAME;
-    SaImmAttrValuesT_2 **attributes = NULL;
-    SaImmAttrValuesT_2 *attrVal = NULL;
     TRACE_ENTER();
 
-    if(cbi->type == IMMA_CALLBACK_OI_CCB_CREATE) {
-           /* Admo attribute for created object should be in attr list.*/
-           int i=0;
-           attributes = (SaImmAttrValuesT_2 **) cbi->attrValsForCreateUc;
-           while((attrVal = attributes[i++]) != NULL) {
-                   if(strcmp(admoNameAttr, attrVal->attrName)==0) {
-                           TRACE("Found %s attribute in object create upcall", 
admoNameAttr);
-                           break;
-                   }
-           }
-
-           if(!attrVal || strcmp(attrVal->attrName, admoNameAttr) || 
(attrVal->attrValuesNumber!=1) ||
-                   (attrVal->attrValueType != SA_IMM_ATTR_SASTRINGT)) {
-                   LOG_ER("Missmatch on attribute %s", admoNameAttr);
-                   abort();
-           }
-
-           osaf_extended_name_alloc(*(SaStringT*) attrVal->attrValues[0], 
admoNameOut);
-
-    } else {
-           /* modify or delete => fetch admo attribute for object from server. 
*/
-           if((cbi->type != IMMA_CALLBACK_OI_CCB_DELETE) &&
-                   (cbi->type != IMMA_CALLBACK_OI_CCB_MODIFY)) {
-                   LOG_ER("Inconsistency in callback type:%u", cbi->type);
-                   abort();
-           }
-
-           osafassert(immsv_om_augment_ccb_get_admo_name);
-           rc = immsv_om_augment_ccb_get_admo_name(privateOmHandle, 
&(cbi->name), admoNameOut);
-           if(rc == SA_AIS_ERR_LIBRARY) {
-                   LOG_ER("Missmatch on attribute %s for delete or modify", 
admoNameAttr);
-           }
+    /* modify or delete => fetch admo attribute for object from server. */
+    if((cbi->type != IMMA_CALLBACK_OI_CCB_DELETE) &&
+                   (cbi->type != IMMA_CALLBACK_OI_CCB_MODIFY) && 
+                   (cbi->type != IMMA_CALLBACK_OI_CCB_COMPLETED)) {
+           LOG_ER("Inconsistency in callback type:%u", cbi->type);
+           abort();
     }
 
+    osafassert(immsv_om_augment_ccb_get_admo_name);
+    rc = immsv_om_augment_ccb_get_admo_name(privateOmHandle, object, 
admOwnerOut);
+    if(rc == SA_AIS_ERR_LIBRARY) {
+           LOG_ER("Missmatch on attribute %s for delete or modify", 
admoNameAttr);
+    }
+
     /* attrVal found either in create callback, or fetched from server. */
 
     if(rc == SA_AIS_OK) {
-           TRACE("Obtained AdmoName:%s", 
osaf_extended_name_borrow(admoNameOut));
+           TRACE("Obtained AdmoOwner:%s", *admOwnerOut);
     }
     TRACE_LEAVE();
     return rc;
@@ -3734,6 +3712,7 @@ SaAisErrorT saImmOiAugmentCcbInitialize(
                goto done;
        }
 
+       struct imma_oi_ccb_record *ccb_oi_record = 
imma_oi_ccb_record_find(cl_node, ccbId);
        cbi = imma_oi_ccb_record_ok_augment(cl_node, ccbId, &privateOmHandle, 
&privateAoHandle);
        if(!cbi) {
                TRACE_2("ERR_BAD_OPERATION: Ccb %u, is not in a state that "
@@ -3848,34 +3827,43 @@ SaAisErrorT saImmOiAugmentCcbInitialize(
 
                if(!privateAoHandle) {
                        TRACE("AugCcbinit: Admo has ReleaseOnFinalize FALSE "
-                               "=> init separate admo => must fetch admo-name 
first");
+                                       "=> init separate admo => must fetch 
admo-name first");
                        osafassert(locked == false);
-                       SaNameT admName;/* Used to get admo string name copied 
to stack.*/
-
-                       rc = getAdmoName(privateOmHandle, cbi, &admName);
-                       if(rc != SA_AIS_OK) {
-                               TRACE("ERR_TRY_AGAIN: failed to obtain 
SaImmAttrAdminOwnerName %u", rc);
-                               if(rc != SA_AIS_ERR_TRY_AGAIN) {
-                                       rc = SA_AIS_ERR_TRY_AGAIN;
+                       SaStringT adminOwner = NULL;/* Used to get admo string 
name copied to stack.*/
+
+                       osafassert(immsv_om_admo_handle_initialize);
+                       if(ccb_oi_record->adminOwner){
+                               rc = 
immsv_om_admo_handle_initialize(privateOmHandle, ccb_oi_record->adminOwner, 
+                                               &privateAoHandle);
+                       } else {
+                               rc = getAdmoName(privateOmHandle, cbi, 
ccb_oi_record->object, &adminOwner);
+
+                               if(rc != SA_AIS_OK) {
+                                       TRACE("ERR_TRY_AGAIN: failed to obtain 
SaImmAttrAdminOwnerName %u", rc);
+                                       if(rc != SA_AIS_ERR_TRY_AGAIN) {
+                                               rc = SA_AIS_ERR_TRY_AGAIN;
+                                       }
+                                       goto done;
                                }
-                               osaf_extended_name_free(&admName);
-                               goto done;
+                               /* Allocate private admowner with 
ReleaseOnFinalize as TRUE */
+                               rc = 
immsv_om_admo_handle_initialize(privateOmHandle, adminOwner, &privateAoHandle);
                        }
-                       TRACE("Obtaned AdminOwnerName:%s", 
osaf_extended_name_borrow(&admName));
-                       /* Allocate private admowner with ReleaseOnFinalize as 
TRUE */
-                       osafassert(immsv_om_admo_handle_initialize);
-                       rc = immsv_om_admo_handle_initialize(privateOmHandle,
-                               (SaImmAdminOwnerNameT) 
osaf_extended_name_borrow(&admName), &privateAoHandle);
 
                        if(rc != SA_AIS_OK) {
                                TRACE("ERR_TRY_AGAIN: failed to obtain internal 
admo handle rc:%u", rc);
                                if(rc != SA_AIS_ERR_TRY_AGAIN) {
                                        rc = SA_AIS_ERR_TRY_AGAIN;
                                }
-                               osaf_extended_name_free(&admName);
+                               if(adminOwner){
+                                       free(adminOwner);
+                                       adminOwner = NULL;
+                               }
                                goto done;
                        }
-                       osaf_extended_name_free(&admName);
+                       if(adminOwner){
+                               free(adminOwner);
+                               adminOwner = NULL;
+                       }
                }
        } else {TRACE("AugCcbinit: Admo has ROF == TRUE");}
 
@@ -3888,8 +3876,8 @@ SaAisErrorT saImmOiAugmentCcbInitialize(
        /* Now dip into the OM library & create mockup ccb-node & admo-node for 
use by OI */
        osafassert(immsv_om_augment_ccb_initialize);
        rc = immsv_om_augment_ccb_initialize(privateOmHandle, ccbId, 
adminOwnerId,
-               ccbHandle, &privateAoHandle);
- done:
+                       ccbHandle, &privateAoHandle);
+done:
 
        if (locked) {
                m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
diff --git a/osaf/libs/agents/saf/imma/imma_om_api.c 
b/osaf/libs/agents/saf/imma/imma_om_api.c
--- a/osaf/libs/agents/saf/imma/imma_om_api.c
+++ b/osaf/libs/agents/saf/imma/imma_om_api.c
@@ -9690,8 +9690,8 @@ SaAisErrorT immsv_om_augment_ccb_get_res
 
 SaAisErrorT immsv_om_augment_ccb_get_admo_name(
                               SaImmHandleT privateOmHandle,
-                              SaNameT* objectName,
-                              SaNameT* admoNameOut)
+                              SaStringT object,
+                              SaStringT * admoNameOut)
 
 {
        SaAisErrorT rc = SA_AIS_OK;
@@ -9701,12 +9701,11 @@ SaAisErrorT immsv_om_augment_ccb_get_adm
        SaImmAttrValuesT_2 *attrVal = NULL;
        SaImmAccessorHandleT acHdl=0LL;
        TRACE_ENTER();  
-       osaf_extended_name_clear(admoNameOut);
 
        rc = saImmOmAccessorInitialize(privateOmHandle, &acHdl);
        if(rc != SA_AIS_OK) {goto done;}
 
-       rc = saImmOmAccessorGet_2(acHdl, objectName, attributeNames, 
&attributes);
+       rc = saImmOmAccessorGet_o3(acHdl, (SaConstStringT)object, 
attributeNames, &attributes);
        if(rc != SA_AIS_OK) {goto finalize;}
 
        attrVal = attributes[0];
@@ -9714,8 +9713,8 @@ SaAisErrorT immsv_om_augment_ccb_get_adm
                rc = SA_AIS_ERR_LIBRARY;
                goto finalize;
        }
-
-       osaf_extended_name_alloc(*(SaStringT*) attrVal->attrValues[0], 
admoNameOut);
+       *admoNameOut = (SaStringT) malloc(strlen(*(SaStringT*) 
attrVal->attrValues[0])+1);
+       strcpy(*admoNameOut, *(SaStringT*) attrVal->attrValues[0]);
 
  finalize:
     if(acHdl) {
diff --git a/osaf/libs/agents/saf/imma/imma_proc.c 
b/osaf/libs/agents/saf/imma/imma_proc.c
--- a/osaf/libs/agents/saf/imma/imma_proc.c
+++ b/osaf/libs/agents/saf/imma/imma_proc.c
@@ -2285,7 +2285,6 @@ static bool imma_process_callback_info(I
                                IMMSV_EVT ccbObjCrRpl;
                                bool locked = false;
                                SaImmAttrValuesT_2 **attr = NULL;
-                               size_t attrDataSize = 0;
                                int i = 0;
                                /* No need to check for 
o.iCallbkA2f.saImmOiCcbObjectCreateCallback
                                 * "o" is union and 
o.iCallbk.saImmOiCcbObjectCreateCallback is same
@@ -2308,62 +2307,11 @@ static bool imma_process_callback_info(I
 
                                        const SaImmClassNameT className = 
callback->className;  /*0 */
                                        callback->className = NULL;
-                                       int noOfAttributes = 0;
-
-                                       /* NOTE: The code below is practically 
a copy of the code
-                                          in immOm searchNext, for serving the 
attrValues structure.
-                                          This code should be factored out 
into some common function.
-                                       */
-                                       IMMSV_ATTR_VALUES_LIST *p = 
callback->attrValues;
-                                       while (p) {
-                                               ++noOfAttributes;
-                                               p = p->next;
-                                       }
-
-                                       p = callback->attrValues;
-
-                                       if(cl_node->isImmA2fCbk) {
-                                               if(noOfAttributes) {
-                                                       p = p->next;  // Skip 
RDN. RDN is the first attribute
-                                                       noOfAttributes--;
-                                               } else {
-                                                       /* There must be at 
least one attribute value */
-                                                       localEr = 
SA_AIS_ERR_BAD_OPERATION;
-                                                       clientCapable = false;
-                                               }
-                                       }
-
-                                       if(localEr == SA_AIS_OK) {
-                                               attrDataSize = 
sizeof(SaImmAttrValuesT_2 *) * (noOfAttributes + 1);
-                                               attr = calloc(1, attrDataSize); 
/*alloc-1 */
-                                               for (; i < noOfAttributes && p; 
i++, p = p->next) {
-                                                       IMMSV_ATTR_VALUES *q = 
&(p->n);
-                                                       attr[i] = calloc(1, 
sizeof(SaImmAttrValuesT_2));        /*alloc-2 */
-                                                       attr[i]->attrName = 
malloc(q->attrName.size + 1);       /*alloc-3 */
-                                                       
strncpy(attr[i]->attrName, (const char *)q->attrName.buf, q->attrName.size + 1);
-                                                       
attr[i]->attrName[q->attrName.size] = 0;        /*redundant. */
-                                                       
attr[i]->attrValuesNumber = q->attrValuesNumber;
-                                                       attr[i]->attrValueType 
= (SaImmValueTypeT)q->attrValueType;
-                                                       if 
(q->attrValuesNumber) {
-                                                               
attr[i]->attrValues =
-                                                                       
calloc(q->attrValuesNumber, sizeof(SaImmAttrValueT));   /*alloc-4 */
-                                                               /*alloc-5 */
-                                                               
attr[i]->attrValues[0] =
-                                                                       
imma_copyAttrValue3(q->attrValueType, &(q->attrValue));
-
-                                                               if 
(q->attrValuesNumber > 1) {
-                                                                       int ix;
-                                                                       
IMMSV_EDU_ATTR_VAL_LIST *r = q->attrMoreValues;
-                                                                       for (ix 
= 1; ix < q->attrValuesNumber; ++ix) {
-                                                                               
osafassert(r);
-                                                                               
attr[i]->attrValues[ix] = /*alloc-5 */
-                                                                               
        imma_copyAttrValue3(q->attrValueType, &(r->n));
-                                                                               
r = r->next;
-                                                                       }//for
-                                                               }//if
-                                                       }//if
-                                               }//for
-                                               attr[i] = NULL; /*redundant */
+
+                                       if(cl_node->isImmA2fCbk && 
!callback->attrValsForCreateUc) {
+                                               /* There must be at least one 
attribute value */
+                                               localEr = 
SA_AIS_ERR_BAD_OPERATION;
+                                               clientCapable = false;
                                        }
 
                                        if(localEr == SA_AIS_OK && 
cl_node->isImmA2fCbk) {
@@ -2388,7 +2336,6 @@ static bool imma_process_callback_info(I
                                           We cant use callback->attrValues 
because it is partially stolen
                                           from (caused to be incomplete) in 
the loop above (see imma_copyAttrValue3).
                                         */
-                                       callback->attrValsForCreateUc = (const 
SaImmAttrValuesT_2 **)attr;
 
                                        if (localEr == SA_AIS_OK
                                                        && 
!osaf_is_extended_names_enabled()
@@ -2457,6 +2404,7 @@ static bool imma_process_callback_info(I
 
                                        free(className);        /*free-0 */
                                        free(objectName);       /*free-6 */
+                                       attr = (SaImmAttrValuesT_2 **) 
callback->attrValsForCreateUc;
                                        for (i = 0; attr[i]; ++i) {
                                                free(attr[i]->attrName);        
/*free-3 */
                                                attr[i]->attrName = 0;

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to