diff options
author | Mattias Andrée <maandree@operamail.com> | 2014-11-10 20:43:43 +0100 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2014-11-10 20:43:43 +0100 |
commit | 9d3c08e633b70fbc236cc8e197732ba32f9fc5cb (patch) | |
tree | 16f54bf3dd4b28da689931cbd06a30ada4d5ff80 /src/mds-kbdc | |
parent | mds-kbdc: add support for return, continue and break (diff) | |
download | mds-9d3c08e633b70fbc236cc8e197732ba32f9fc5cb.tar.gz mds-9d3c08e633b70fbc236cc8e197732ba32f9fc5cb.tar.bz2 mds-9d3c08e633b70fbc236cc8e197732ba32f9fc5cb.tar.xz |
memory leak
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src/mds-kbdc')
-rw-r--r-- | src/mds-kbdc/mds-kbdc.c | 3 | ||||
-rw-r--r-- | src/mds-kbdc/tree.c | 6 |
2 files changed, 8 insertions, 1 deletions
diff --git a/src/mds-kbdc/mds-kbdc.c b/src/mds-kbdc/mds-kbdc.c index d7427d2..fccd1df 100644 --- a/src/mds-kbdc/mds-kbdc.c +++ b/src/mds-kbdc/mds-kbdc.c @@ -57,9 +57,10 @@ int main(int argc_, char** argv_) } mds_kbdc_parse_error_free_all(parse_errors); if (fatal) - return 1; + return mds_kbdc_tree_free(tree), 1; } + mds_kbdc_tree_free(tree); return 0; pfail: diff --git a/src/mds-kbdc/tree.c b/src/mds-kbdc/tree.c index 600bf2a..99fa223 100644 --- a/src/mds-kbdc/tree.c +++ b/src/mds-kbdc/tree.c @@ -63,6 +63,9 @@ static void mds_kbdc_tree_destroy_(mds_kbdc_tree_t* restrict this, int recursive #define xfree(t, v) (free(V(t, v)), V(t, v) = NULL) #define xdestroy(t, v) (recursive ? (mds_kbdc_tree_destroy_(V(t, v), 1), xfree(t, v)) : (V(t, v) = NULL)) + mds_kbdc_tree_t* prev = NULL; + mds_kbdc_tree_t* first = this; + again: if (this == NULL) return; @@ -149,7 +152,10 @@ static void mds_kbdc_tree_destroy_(mds_kbdc_tree_t* restrict this, int recursive break; } + prev = this; this = this->next; + if (prev != first) + free(prev); goto again; #undef xdestroy |