Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
better handling of info_* in smpi to avoid leaks
authordegomme <augustin.degomme@unibas.ch>
Tue, 16 Aug 2016 00:09:04 +0000 (02:09 +0200)
committerdegomme <augustin.degomme@unibas.ch>
Tue, 16 Aug 2016 00:09:23 +0000 (02:09 +0200)
src/smpi/smpi_f77.cpp
src/smpi/smpi_pmpi.cpp

index 0ab3b36..2a955b5 100644 (file)
@@ -782,6 +782,7 @@ void mpi_info_set_( int *info, char *key, char *value, int* ierr, unsigned int k
 
   *ierr =  MPI_Info_set( smpi_info_f2c(*info), tkey, tvalue);
   xbt_free(tkey);
+  xbt_free(tvalue);
 }
 
 void mpi_info_get_ (int* info,char *key,int* valuelen, char *value, int *flag, int* ierr, unsigned int keylen ){
@@ -810,12 +811,6 @@ void mpi_info_get_ (int* info,char *key,int* valuelen, char *value, int *flag, i
 
 void mpi_info_free_(int* info, int* ierr){
   MPI_Info tmp = smpi_info_f2c(*info);
-  const char* key;
-  char* val;
-  xbt_dict_cursor_t cursor;
-  xbt_dict_foreach(tmp->info_dict,cursor,key,val) {
-    xbt_free(val);
-  }
   *ierr =  MPI_Info_free(&tmp);
   if(*ierr == MPI_SUCCESS) {
     free_info(*info);
index 1f4add0..1315a65 100644 (file)
@@ -3120,7 +3120,7 @@ int PMPI_Info_create( MPI_Info *info){
   if (info == nullptr)
     return MPI_ERR_ARG;
   *info = xbt_new(s_smpi_mpi_info_t, 1);
-  (*info)->info_dict= xbt_dict_new_homogeneous(nullptr);
+  (*info)->info_dict= xbt_dict_new_homogeneous(xbt_free_f);
   (*info)->refcount=1;
   return MPI_SUCCESS;
 }
@@ -3129,7 +3129,7 @@ int PMPI_Info_set( MPI_Info info, char *key, char *value){
   if (info == nullptr || key == nullptr || value == nullptr)
     return MPI_ERR_ARG;
 
-  xbt_dict_set(info->info_dict, key, (void*)value, nullptr);
+  xbt_dict_set(info->info_dict, key, xbt_strdup(value), nullptr);
   return MPI_SUCCESS;
 }
 
@@ -3164,13 +3164,13 @@ int PMPI_Info_dup(MPI_Info info, MPI_Info *newinfo){
   if (info == nullptr || newinfo==nullptr)
     return MPI_ERR_ARG;
   *newinfo = xbt_new(s_smpi_mpi_info_t, 1);
-  (*newinfo)->info_dict= xbt_dict_new_homogeneous(nullptr);
+  (*newinfo)->info_dict= xbt_dict_new_homogeneous(xbt_free_f);
   (*newinfo)->refcount=1;
   xbt_dict_cursor_t cursor = nullptr;
   int *key;
   void* data;
   xbt_dict_foreach(info->info_dict,cursor,key,data){
-    xbt_dict_set((*newinfo)->info_dict, reinterpret_cast<char*>(key), data, nullptr);
+    xbt_dict_set((*newinfo)->info_dict, reinterpret_cast<char*>(key), xbt_strdup(reinterpret_cast<char*>(data)), nullptr);
   }
   return MPI_SUCCESS;
 }