From 4567958b25228037afc35b3116064a42a5b9e322 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Sun, 25 Nov 2012 14:21:06 +0100 Subject: [PATCH] plug a (damn) memleak. Gosh, this one was hard to get, too --- src/xbt/xbt_replay.c | 5 +++++ src/xbt/xbt_str.c | 11 +++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/xbt/xbt_replay.c b/src/xbt/xbt_replay.c index 116b0bcee7..c0dbca1b66 100644 --- a/src/xbt/xbt_replay.c +++ b/src/xbt/xbt_replay.c @@ -133,12 +133,15 @@ void _xbt_replay_action_exit(void) int xbt_replay_action_runner(int argc, char *argv[]) { const char **evt; + int i; if (action_fp) { // A unique trace file while ((evt = action_get_action(argv[0]))) { action_fun function = (action_fun)xbt_dict_get(action_funs, evt[1]); function(evt); + for (i=0;evt[i]!= NULL;i++) + free((char*)evt[i]); free(evt); } } else { // Should have got my trace file in argument @@ -153,6 +156,8 @@ int xbt_replay_action_runner(int argc, char *argv[]) action_fun function = (action_fun)xbt_dict_get(action_funs, evt[1]); function(evt); + for (i=0;evt[i]!= NULL;i++) + free((char*)evt[i]); free(evt); } else { XBT_WARN("%s: Ignore trace element not for me", diff --git a/src/xbt/xbt_str.c b/src/xbt/xbt_str.c index d69813304a..e4ea1849e6 100644 --- a/src/xbt/xbt_str.c +++ b/src/xbt/xbt_str.c @@ -327,11 +327,14 @@ xbt_dynar_t xbt_str_split_str(const char *s, const char *sep) * * The string passed as argument must be writable (not const) * The elements of the dynar are just parts of the string passed as argument. + * So if you don't store that argument elsewhere, you should free it in addition + * to freeing the dynar. This can be done by simply freeing the first argument + * of the dynar: + * free(xbt_dynar_get_ptr(dynar,0)); * - * To free the structure constructed by this function, free the first element and free the dynar: - * - * free(xbt_dynar_get_ptr(dynar,0)); - * xbt_dynar_free(&dynar); + * Actually this function puts a bunch of \0 in the memory area you passed as + * argument to separate the elements, and pushes the address of each chunk + * in the resulting dynar. Yes, that's uneven. Yes, that's gory. But that's efficient. */ xbt_dynar_t xbt_str_split_quoted_in_place(char *s) { xbt_dynar_t res = xbt_dynar_new(sizeof(char *), NULL); -- 2.20.1