From: Gabriel Corona Date: Thu, 10 Mar 2016 09:37:50 +0000 (+0100) Subject: [mc] Fix memory leads after calls to xbt_basename() X-Git-Tag: v3_13~453^2~1^2 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/c55f7a29931df2567c0830e45aa889040e54927c [mc] Fix memory leads after calls to xbt_basename() --- diff --git a/src/mc/Process.cpp b/src/mc/Process.cpp index a04ec5c4ed..6bf24dcb9e 100644 --- a/src/mc/Process.cpp +++ b/src/mc/Process.cpp @@ -107,13 +107,17 @@ struct s_mc_memory_map_re { static char* get_lib_name(const char* pathname, struct s_mc_memory_map_re* res) { - const char* map_basename = xbt_basename((char*) pathname); + char* map_basename = xbt_basename(pathname); regmatch_t match; - if(regexec(&res->so_re, map_basename, 1, &match, 0)) + if(regexec(&res->so_re, map_basename, 1, &match, 0)) { + free(map_basename); return nullptr; + } char* libname = strndup(map_basename, match.rm_so); + free(map_basename); + map_basename = nullptr; // Strip the version suffix: if(libname && !regexec(&res->version_re, libname, 1, &match, 0)) { diff --git a/src/mc/mc_checkpoint.cpp b/src/mc/mc_checkpoint.cpp index 5788d9c0b3..99b11bc3ef 100644 --- a/src/mc/mc_checkpoint.cpp +++ b/src/mc/mc_checkpoint.cpp @@ -15,6 +15,7 @@ #include "src/mc/mc_private.h" #include "xbt/module.h" #include +#include #include "src/smpi/private.h" #include "src/xbt/mmalloc/mmprivate.h" @@ -192,14 +193,19 @@ void find_object_address( std::vector const& maps, simgrid::mc::ObjectInformation* result) { - char* file_name = xbt_strdup(result->file_name.c_str()); - const char *name = xbt_basename(file_name); + char* name = xbt_basename(result->file_name.c_str()); + for (size_t i = 0; i < maps.size(); ++i) { simgrid::xbt::VmMap const& reg = maps[i]; - if (maps[i].pathname.empty() - || strcmp(xbt_basename(maps[i].pathname.c_str()), name)) { - // Nothing to do - } else if ((reg.prot & PROT_WRITE)) { + if (maps[i].pathname.empty()) + continue; + char* map_basename = xbt_basename(maps[i].pathname.c_str()); + if (strcmp(name, map_basename) != 0) { + free(map_basename); + continue; + } + free(map_basename); + if ((reg.prot & PROT_WRITE)) { xbt_assert(!result->start_rw, "Multiple read-write segments for %s, not supported", maps[i].pathname.c_str()); @@ -239,7 +245,8 @@ void find_object_address( xbt_assert(result->start_rw); xbt_assert(result->start_exec); - free(file_name); + + free(name); } /************************************* Take Snapshot ************************************/ @@ -515,8 +522,14 @@ static std::vector get_current_fds(pid_t pid) continue; // If dot_output enabled, do not handle the corresponding file - if (dot_output != nullptr && strcmp(xbt_basename(link), _sg_mc_dot_output_file) == 0) - continue; + if (dot_output != nullptr) { + char* link_basename = xbt_basename(link); + if (strcmp(link_basename, _sg_mc_dot_output_file) == 0) { + free(link_basename); + continue; + } + free(link_basename); + } // This is probably a shared memory used by lttng-ust: if(strncmp("/dev/shm/ust-shm-tmp-", link, 21)==0) diff --git a/src/simdag/sd_daxloader.cpp b/src/simdag/sd_daxloader.cpp index d9757d6881..1b7109c698 100644 --- a/src/simdag/sd_daxloader.cpp +++ b/src/simdag/sd_daxloader.cpp @@ -297,7 +297,9 @@ xbt_dynar_t SD_daxload(const char *filename) } if (!acyclic_graph_detail(result)){ - XBT_ERROR("The DAX described in %s is not a DAG. It contains a cycle.", xbt_basename(filename)); + char* base = xbt_basename(filename); + XBT_ERROR("The DAX described in %s is not a DAG. It contains a cycle.", base); + free(base); xbt_dynar_foreach(result, cpt, file) SD_task_destroy(file); xbt_dynar_free_container(&result); diff --git a/src/simdag/sd_dotloader.cpp b/src/simdag/sd_dotloader.cpp index 8e97333978..423df637c8 100644 --- a/src/simdag/sd_dotloader.cpp +++ b/src/simdag/sd_dotloader.cpp @@ -240,7 +240,9 @@ xbt_dynar_t SD_dotload_generic(const char * filename, seq_par_t seq_or_par, bool } if (result && !acyclic_graph_detail(result)) { - XBT_ERROR("The DOT described in %s is not a DAG. It contains a cycle.", xbt_basename((char*)filename)); + char* base = xbt_basename(filename); + XBT_ERROR("The DOT described in %s is not a DAG. It contains a cycle.", base); + free(base); xbt_dynar_free(&result); result = NULL; }