diff options
author | Petr Machata <pmachata@redhat.com> | 2012-10-30 00:23:55 +0100 |
---|---|---|
committer | Petr Machata <pmachata@redhat.com> | 2012-10-30 00:23:55 +0100 |
commit | 3299797320059f659f3abb80f3ce02bab3db8bb9 (patch) | |
tree | db794a21ba27d5389c2bcaeb4ae45a6fc1449605 /expr.c | |
parent | 58e75f5bf209db5edee2a142add49ee447bc4313 (diff) | |
download | ltrace-3299797320059f659f3abb80f3ce02bab3db8bb9.tar.gz |
Also free memory associated with sub-expressions
This only called expr_destroy when the sub-expression was owned, but
neglected to also call free. Plugs a leak.
Diffstat (limited to 'expr.c')
-rw-r--r-- | expr.c | 19 |
1 files changed, 10 insertions, 9 deletions
@@ -126,10 +126,12 @@ expr_init_cb2(struct expr_node *node, } static void -release_lhs(struct expr_node *node) +release_expr(struct expr_node *node, int own) { - if (node->own_lhs) - expr_destroy(node->lhs); + if (own) { + expr_destroy(node); + free(node); + } } void @@ -153,17 +155,16 @@ expr_destroy(struct expr_node *node) return; case EXPR_OP_INDEX: - release_lhs(node); - if (node->u.node.own) - expr_destroy(node->u.node.n); + release_expr(node->lhs, node->own_lhs); + release_expr(node->u.node.n, node->u.node.own); return; case EXPR_OP_CALL2: - if (node->u.call.own_rhs) - expr_destroy(node->u.call.rhs); + release_expr(node->u.call.rhs, node->u.call.own_rhs); + /* Fall through. */ case EXPR_OP_UP: case EXPR_OP_CALL1: - release_lhs(node); + release_expr(node->lhs, node->own_lhs); return; } |