Commit 97a0549b authored by Taehee Yoo's avatar Taehee Yoo Committed by Pablo Neira Ayuso

netfilter: nft_meta: fix wrong value dereference in nft_meta_set_eval

In the nft_meta_set_eval, nftrace value is dereferenced as u32 from sreg.
But correct type is u8. so that sometimes incorrect value is dereferenced.

Steps to reproduce:

   %nft add table ip filter
   %nft add chain ip filter input { type filter hook input priority 4\; }
   %nft add rule ip filter input nftrace set 0
   %nft monitor

Sometimes, we can see trace messages.

   trace id 16767227 ip filter input packet: iif "enp2s0"
   ether saddr xx:xx:xx:xx:xx:xx ether daddr xx:xx:xx:xx:xx:xx
   ip saddr 192.168.0.1 ip daddr 255.255.255.255 ip dscp cs0
   ip ecn not-ect ip
   trace id 16767227 ip filter input rule nftrace set 0 (verdict continue)
   trace id 16767227 ip filter input verdict continue
   trace id 16767227 ip filter input
Signed-off-by: default avatarTaehee Yoo <ap420073@gmail.com>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 94c752f9
...@@ -234,7 +234,7 @@ void nft_meta_set_eval(const struct nft_expr *expr, ...@@ -234,7 +234,7 @@ void nft_meta_set_eval(const struct nft_expr *expr,
struct sk_buff *skb = pkt->skb; struct sk_buff *skb = pkt->skb;
u32 *sreg = &regs->data[meta->sreg]; u32 *sreg = &regs->data[meta->sreg];
u32 value = *sreg; u32 value = *sreg;
u8 pkt_type; u8 value8;
switch (meta->key) { switch (meta->key) {
case NFT_META_MARK: case NFT_META_MARK:
...@@ -244,15 +244,17 @@ void nft_meta_set_eval(const struct nft_expr *expr, ...@@ -244,15 +244,17 @@ void nft_meta_set_eval(const struct nft_expr *expr,
skb->priority = value; skb->priority = value;
break; break;
case NFT_META_PKTTYPE: case NFT_META_PKTTYPE:
pkt_type = nft_reg_load8(sreg); value8 = nft_reg_load8(sreg);
if (skb->pkt_type != pkt_type && if (skb->pkt_type != value8 &&
skb_pkt_type_ok(pkt_type) && skb_pkt_type_ok(value8) &&
skb_pkt_type_ok(skb->pkt_type)) skb_pkt_type_ok(skb->pkt_type))
skb->pkt_type = pkt_type; skb->pkt_type = value8;
break; break;
case NFT_META_NFTRACE: case NFT_META_NFTRACE:
skb->nf_trace = !!value; value8 = nft_reg_load8(sreg);
skb->nf_trace = !!value8;
break; break;
default: default:
WARN_ON(1); WARN_ON(1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment