The original object name `state->objectName` was copied using the function
osaf_extended_name_lend(state->objectName, &objectName).

In case of long dn object, the `objectName` contained a reference to the string
which was stored in `state->objectName`, any change to `state->objectName`,
in this case it was the code line `state->objectName[DNlen] = '\0',
would impact the backup `objectName`.

As the `objectName` had been changed unintentionally to non-existing object dn,
`saImmOmAccessorGet_2` returned `SA_AIS_ERR_NOT_EXIST` unexpectedly.

With this fix, using C++ string to copy the `state->objectName` value.
Extracting parent DN, and object RDN are operating on C++ string, don't
change the original value.
---
 src/imm/tools/imm_import.cc | 39 +++++++++++++++++++--------------------
 1 file changed, 19 insertions(+), 20 deletions(-)

diff --git a/src/imm/tools/imm_import.cc b/src/imm/tools/imm_import.cc
index 5397c67..e2bdcba 100644
--- a/src/imm/tools/imm_import.cc
+++ b/src/imm/tools/imm_import.cc
@@ -182,6 +182,7 @@ static SaImmValueTypeT getClassAttrValueType(ParserState *, 
const char *,
                                              const char *);
 static void saveRDNAttribute(ParserState *parserState);
 static void getDNForClass(ParserState *, const SaImmClassNameT,
+                          const std::string&,
                           SaImmAttrValuesT_2 *);
 static int charsToValueHelper(SaImmAttrValueT *, SaImmValueTypeT, const char *,
                               bool strictParse);
@@ -633,7 +634,8 @@ static void createImmObject(ParserState *state) {
   SaAisErrorT errorCode = SA_AIS_OK;
   int i = 0;
   size_t DNlen;
-  SaNameT objectName;
+  const char *parent = nullptr;
+  std::string rdn;
   std::list<SaImmAttrValuesT_2>::iterator it;
 
   TRACE_8("CREATE IMM OBJECT %s, %s", state->objectClass, state->objectName);
@@ -645,23 +647,21 @@ static void createImmObject(ParserState *state) {
 
   /* Set the parent name */
   osaf_extended_name_clear(&parentName);
-  if (state->objectName != NULL) {
-    char *parent;
-    osaf_extended_name_lend(state->objectName, &objectName);
-
+  if (state->objectName != nullptr) {
+    rdn = std::string{state->objectName};
     /* ',' is the delimeter */
     /* but '\' is the escape character, used for association objects */
-    parent = state->objectName;
+    parent = rdn.c_str();
     do {
       parent = strchr(parent, ',');
       TRACE_8("PARENT: %s", parent);
     } while (parent && (*((++parent) - 2)) == '\\');
 
     if (parent && strlen(parent) <= 1) {
-      parent = NULL;
+      parent = nullptr;
     }
 
-    if (parent != NULL) osaf_extended_name_lend(parent, &parentName);
+    if (parent != nullptr) osaf_extended_name_lend(parent, &parentName);
   } else {
     LOG_ER("Empty DN for object");
     stopParser(state);
@@ -675,19 +675,13 @@ static void createImmObject(ParserState *state) {
 
   if (state->ctxt->instate == XML_PARSER_EOF) return;
 
-#ifdef TRACE_8
   /* Get the length of the DN and truncate state->objectName */
   if (!osaf_is_extended_name_empty(&parentName)) {
     DNlen = strlen(state->objectName) -
             (strlen(osaf_extended_name_borrow(&parentName)) + 1);
-  } else {
-    DNlen = strlen(state->objectName);
+    rdn[DNlen] = '\0';
   }
 
-  state->objectName[DNlen] = '\0';
-  TRACE_8("OBJECT NAME: %s", state->objectName);
-#endif
-
   if (!state->validation) {
     /* Set the attribute values array, add space for the rdn attribute
      * and a NULL terminator */
@@ -717,17 +711,19 @@ static void createImmObject(ParserState *state) {
 
     /* Do the actual creation */
     attrValues[i] = (SaImmAttrValuesT_2 *)calloc(1, 
sizeof(SaImmAttrValuesT_2));
-    getDNForClass(state, className, attrValues[i]);
+    getDNForClass(state, className, rdn, attrValues[i]);
 
     if (state->ctxt->instate != XML_PARSER_EOF) {
       errorCode = immutil_saImmOmCcbObjectCreate_2(
-          state->ccbHandle, className, &parentName,
+          state->ccbHandle, className,
+          (parent == nullptr) ? nullptr : &parentName,
           (const SaImmAttrValuesT_2 **)attrValues);
     } else {
       goto done;
     }
-  } else
+  } else {
     attrValues = NULL;
+  }
 
   if (SA_AIS_OK != errorCode) {
     if ((errorCode == SA_AIS_ERR_NOT_EXIST) && imm_import_ccb_safe) {
@@ -746,6 +742,7 @@ static void createImmObject(ParserState *state) {
       SaImmAttrValuesT_2 **existing_attributes;
       SaImmAttrValuesT_2 *attr;
       const char *existing_className;
+      SaNameT dn;
 
       LOG_IN("OBJECT %s already exist, verifying...", state->objectName);
 
@@ -759,7 +756,8 @@ static void createImmObject(ParserState *state) {
         goto done;
       }
 
-      errorCode = immutil_saImmOmAccessorGet_2(accessorHandle, &objectName,
+      osaf_extended_name_lend(state->objectName, &dn);
+      errorCode = immutil_saImmOmAccessorGet_2(accessorHandle, &dn,
                                                NULL,  // get all attributes
                                                &existing_attributes);
       if (SA_AIS_OK != errorCode) {
@@ -1149,6 +1147,7 @@ static void createImmClass(ParserState *state) {
  * Returns an SaImmAttrValueT struct representing the DN for an object
  */
 static void getDNForClass(ParserState *state, const SaImmClassNameT className,
+                          const std::string& rdn,
                           SaImmAttrValuesT_2 *values) {
   std::string classNameString;
 
@@ -1176,7 +1175,7 @@ static void getDNForClass(ParserState *state, const 
SaImmClassNameT className,
   values->attrValuesNumber = 1;
 
   if (charsToValueHelper(values->attrValues, values->attrValueType,
-                         state->objectName, true)) {
+                         rdn.c_str(), true)) {
     free(values->attrValues);
     values->attrValues = NULL;
 
-- 
1.9.1


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to