aboutsummaryrefslogtreecommitdiffstats
path: root/src/mds-kbdc
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-11-10 20:43:43 +0100
committerMattias Andrée <maandree@operamail.com>2014-11-10 20:43:43 +0100
commit9d3c08e633b70fbc236cc8e197732ba32f9fc5cb (patch)
tree16f54bf3dd4b28da689931cbd06a30ada4d5ff80 /src/mds-kbdc
parentmds-kbdc: add support for return, continue and break (diff)
downloadmds-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.c3
-rw-r--r--src/mds-kbdc/tree.c6
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