Problem:
- There are some unsafe memory accesses which may cause segfault in
avnd_comptype_delete() function.

Fix:
- Check if a pointer is valid before accessing it.
- Minor update in avnd_comptype_create() function to avoid unnecessary
function call to avnd_comptype_delete().
---
 src/amf/amfnd/compdb.cc | 95 +++++++++++++++++++++++++++----------------------
 1 file changed, 53 insertions(+), 42 deletions(-)

diff --git a/src/amf/amfnd/compdb.cc b/src/amf/amfnd/compdb.cc
index cf6e3ff..decf3ab 100644
--- a/src/amf/amfnd/compdb.cc
+++ b/src/amf/amfnd/compdb.cc
@@ -766,48 +766,67 @@ static void avnd_comptype_delete(amf_comp_type_t *compt) {
 
   delete[] compt->saAmfCtRelPathInstantiateCmd;
 
-  /* Free saAmfCtDefInstantiateCmdArgv[i] before freeing
-   * saAmfCtDefInstantiateCmdArgv */
-  arg_counter = 0;
-  while ((argv = compt->saAmfCtDefInstantiateCmdArgv[arg_counter++]) != 
nullptr)
-    delete[] argv;
-  delete[] compt->saAmfCtDefInstantiateCmdArgv;
+  if (compt->saAmfCtDefInstantiateCmdArgv != nullptr) {
+    /* Free saAmfCtDefInstantiateCmdArgv[i] before freeing
+     * saAmfCtDefInstantiateCmdArgv */
+    arg_counter = 0;
+    while ((argv = compt->saAmfCtDefInstantiateCmdArgv[arg_counter++]) !=
+            nullptr)
+      delete[] argv;
+    delete[] compt->saAmfCtDefInstantiateCmdArgv;
+  }
 
   delete[] compt->saAmfCtRelPathTerminateCmd;
 
-  /* Free saAmfCtDefTerminateCmdArgv[i] before freeing
-   * saAmfCtDefTerminateCmdArgv */
-  arg_counter = 0;
-  while ((argv = compt->saAmfCtDefTerminateCmdArgv[arg_counter++]) != nullptr)
-    delete[] argv;
-  delete[] compt->saAmfCtDefTerminateCmdArgv;
+  if (compt->saAmfCtDefTerminateCmdArgv != nullptr) {
+    /* Free saAmfCtDefTerminateCmdArgv[i] before freeing
+     * saAmfCtDefTerminateCmdArgv */
+    arg_counter = 0;
+    while ((argv = compt->saAmfCtDefTerminateCmdArgv[arg_counter++]) != 
nullptr)
+      delete[] argv;
+    delete[] compt->saAmfCtDefTerminateCmdArgv;
+  }
 
   delete[] compt->saAmfCtRelPathCleanupCmd;
-  /* Free saAmfCtDefCleanupCmdArgv[i] before freeing saAmfCtDefCleanupCmdArgv 
*/
-  arg_counter = 0;
-  while ((argv = compt->saAmfCtDefCleanupCmdArgv[arg_counter++]) != nullptr)
-    delete[] argv;
-  delete[] compt->saAmfCtDefCleanupCmdArgv;
+
+  if (compt->saAmfCtDefCleanupCmdArgv != nullptr) {
+    /* Free saAmfCtDefCleanupCmdArgv[i] before freeing
+     * saAmfCtDefCleanupCmdArgv */
+    arg_counter = 0;
+    while ((argv = compt->saAmfCtDefCleanupCmdArgv[arg_counter++]) != nullptr)
+      delete[] argv;
+    delete[] compt->saAmfCtDefCleanupCmdArgv;
+  }
 
   delete[] compt->saAmfCtRelPathAmStartCmd;
-  /* Free saAmfCtDefAmStartCmdArgv[i] before freeing saAmfCtDefAmStartCmdArgv 
*/
-  arg_counter = 0;
-  while ((argv = compt->saAmfCtDefAmStartCmdArgv[arg_counter++]) != nullptr)
-    delete[] argv;
-  delete[] compt->saAmfCtDefAmStartCmdArgv;
+
+  if (compt->saAmfCtDefAmStartCmdArgv != nullptr) {
+    /* Free saAmfCtDefAmStartCmdArgv[i] before freeing
+     *  saAmfCtDefAmStartCmdArgv */
+    arg_counter = 0;
+    while ((argv = compt->saAmfCtDefAmStartCmdArgv[arg_counter++]) != nullptr)
+      delete[] argv;
+    delete[] compt->saAmfCtDefAmStartCmdArgv;
+  }
 
   delete[] compt->saAmfCtRelPathAmStopCmd;
-  /* Free saAmfCtDefAmStopCmdArgv[i] before freeing saAmfCtDefAmStopCmdArgv */
-  arg_counter = 0;
-  while ((argv = compt->saAmfCtDefAmStopCmdArgv[arg_counter++]) != nullptr)
-    delete[] argv;
-  delete[] compt->saAmfCtDefAmStopCmdArgv;
+
+  if (compt->saAmfCtDefAmStopCmdArgv != nullptr) {
+    /* Free saAmfCtDefAmStopCmdArgv[i] before freeing saAmfCtDefAmStopCmdArgv 
*/
+    arg_counter = 0;
+    while ((argv = compt->saAmfCtDefAmStopCmdArgv[arg_counter++]) != nullptr)
+      delete[] argv;
+    delete[] compt->saAmfCtDefAmStopCmdArgv;
+  }
 
   delete[] compt->osafAmfCtRelPathHcCmd;
-  arg_counter = 0;
-  while ((argv = compt->osafAmfCtDefHcCmdArgv[arg_counter++]) != nullptr)
-    delete[] argv;
-  delete[] compt->osafAmfCtDefHcCmdArgv;
+
+  if (compt->osafAmfCtDefHcCmdArgv != nullptr) {
+    arg_counter = 0;
+    while ((argv = compt->osafAmfCtDefHcCmdArgv[arg_counter++]) != nullptr)
+      delete[] argv;
+    delete[] compt->osafAmfCtDefHcCmdArgv;
+  }
 
   delete compt;
 
@@ -817,8 +836,7 @@ static void avnd_comptype_delete(amf_comp_type_t *compt) {
 static amf_comp_type_t *avnd_comptype_create(SaImmHandleT immOmHandle,
                                              const std::string &dn) {
   SaImmAccessorHandleT accessorHandle;
-  amf_comp_type_t *compt;
-  int rc = -1;
+  amf_comp_type_t *compt = nullptr;
   unsigned int i;
   unsigned int j;
   const char *str;
@@ -827,8 +845,6 @@ static amf_comp_type_t *avnd_comptype_create(SaImmHandleT 
immOmHandle,
 
   TRACE_ENTER2("'%s'", dn.c_str());
 
-  compt = new amf_comp_type_t();
-
   (void)amf_saImmOmAccessorInitialize(immOmHandle, accessorHandle);
 
   if (amf_saImmOmAccessorGet_o2(immOmHandle, accessorHandle, dn, nullptr,
@@ -838,6 +854,8 @@ static amf_comp_type_t *avnd_comptype_create(SaImmHandleT 
immOmHandle,
     goto done;
   }
 
+  compt = new amf_comp_type_t();
+
   compt->name = dn;
 
   if (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfCtCompCategory"),
@@ -993,14 +1011,7 @@ static amf_comp_type_t *avnd_comptype_create(SaImmHandleT 
immOmHandle,
                       &compt->saAmfCtDefDisableRestart) != SA_AIS_OK)
     compt->saAmfCtDefDisableRestart = false;
 
-  rc = 0;
-
 done:
-  if (rc != 0) {
-    avnd_comptype_delete(compt);
-    compt = nullptr;
-  }
-
   (void)immutil_saImmOmAccessorFinalize(accessorHandle);
 
   TRACE_LEAVE();
-- 
2.9.3


------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to