summaryrefslogtreecommitdiffstats
path: root/src/expression.c
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2015-01-12 09:48:39 +0000
committerPatrick McHardy <kaber@trash.net>2015-01-12 09:51:25 +0000
commit1f1ff357b76f2d50fe093b673478070f340fa5d4 (patch)
tree48a47f3be8345c532f65ef1ed53e3149c18c7389 /src/expression.c
parent67e392beb977b1929b4db5a406a3051389ea3158 (diff)
expr: fix crash when listing non-verdict mappings
Fix regression introduced by commit 87c2a2205: netlink_delinearize: clone on netlink_get_register(), release previous on _set() When using a non-verdict mapping, the set ref expression is assigned to the destination register. The next get_register() will attempt to clone it and crash because of the missing ->clone() callback. # nft filter input meta mark set ip daddr map { 192.168.0.1 : 123 } # nft list table filter Segmentation fault (core dumped) Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'src/expression.c')
-rw-r--r--src/expression.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/expression.c b/src/expression.c
index 8ba2e8a1..5b848da7 100644
--- a/src/expression.c
+++ b/src/expression.c
@@ -858,6 +858,11 @@ static void set_ref_expr_print(const struct expr *expr)
printf("@%s", expr->set->handle.set);
}
+static void set_ref_expr_clone(struct expr *new, const struct expr *expr)
+{
+ new->set = set_get(expr->set);
+}
+
static void set_ref_expr_destroy(struct expr *expr)
{
set_free(expr->set);
@@ -867,6 +872,7 @@ static const struct expr_ops set_ref_expr_ops = {
.type = EXPR_SET_REF,
.name = "set reference",
.print = set_ref_expr_print,
+ .clone = set_ref_expr_clone,
.destroy = set_ref_expr_destroy,
};