]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: reject: fix crash if we specify ether type or meta nfproto
authorAlvaro Neira <alvaroneay@gmail.com>
Mon, 20 Oct 2014 13:32:09 +0000 (15:32 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 21 Oct 2014 08:16:29 +0000 (10:16 +0200)
If we use this rule:

nft add rule bridge filter input \
ether type ip reject with icmp type host-unreachable

or that:

nft add rule inet filter input \
meta nfproto ipv4 reject with icmp type host-unreachable

we have a segfault because we add a network dependency when we already have
network context.

Signed-off-by: Alvaro Neira Ayuso <alvaroneay@gmail.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/evaluate.c

index d61d76babc11e5280bd7c294cfe5114e69065da4..1fec1201de9208e6b818a7f2233cd709a1f043a3 100644 (file)
@@ -1142,7 +1142,7 @@ static int reject_payload_gen_dependency_tcp(struct eval_ctx *ctx,
                return 0;
        *payload = payload_expr_alloc(&stmt->location, &proto_tcp,
                                      TCPHDR_UNSPEC);
-       return 0;
+       return 1;
 }
 
 static int reject_payload_gen_dependency_family(struct eval_ctx *ctx,
@@ -1171,7 +1171,7 @@ static int reject_payload_gen_dependency_family(struct eval_ctx *ctx,
        default:
                BUG("unknown reject family");
        }
-       return 0;
+       return 1;
 }
 
 static int stmt_reject_gen_dependency(struct eval_ctx *ctx, struct stmt *stmt,
@@ -1179,21 +1179,21 @@ static int stmt_reject_gen_dependency(struct eval_ctx *ctx, struct stmt *stmt,
 {
        struct expr *payload = NULL;
        struct stmt *nstmt;
+       int ret;
 
        switch (stmt->reject.type) {
        case NFT_REJECT_TCP_RST:
-               if (reject_payload_gen_dependency_tcp(ctx, stmt, &payload) < 0)
-                       return -1;
+               ret = reject_payload_gen_dependency_tcp(ctx, stmt, &payload);
                break;
        case NFT_REJECT_ICMP_UNREACH:
-               if (reject_payload_gen_dependency_family(ctx, stmt,
-                                                        &payload) < 0)
-                       return -1;
+               ret = reject_payload_gen_dependency_family(ctx, stmt, &payload);
                break;
        default:
                BUG("cannot generate reject dependency for type %d",
                    stmt->reject.type);
        }
+       if (ret <= 0)
+               return ret;
 
        if (payload_gen_dependency(ctx, payload, &nstmt) < 0)
                return -1;