aboutsummaryrefslogtreecommitdiff
path: root/expr.c
diff options
context:
space:
mode:
authorPetr Machata <pmachata@redhat.com>2012-10-30 00:23:55 +0100
committerPetr Machata <pmachata@redhat.com>2012-10-30 00:23:55 +0100
commit3299797320059f659f3abb80f3ce02bab3db8bb9 (patch)
treedb794a21ba27d5389c2bcaeb4ae45a6fc1449605 /expr.c
parent58e75f5bf209db5edee2a142add49ee447bc4313 (diff)
downloadltrace-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.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/expr.c b/expr.c
index c0ebcef..32860fd 100644
--- a/expr.c
+++ b/expr.c
@@ -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;
}