OSDN Git Service

netfilter: bridge: call pskb_may_pull in br_nf_check_hbh_len
authorXin Long <lucien.xin@gmail.com>
Tue, 7 Mar 2023 21:31:27 +0000 (16:31 -0500)
committerFlorian Westphal <fw@strlen.de>
Wed, 8 Mar 2023 13:25:38 +0000 (14:25 +0100)
When checking Hop-by-hop option header, if the option data is in
nonlinear area, it should do pskb_may_pull instead of discarding
the skb as a bad IPv6 packet.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
Reviewed-by: Aaron Conole <aconole@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
net/bridge/br_netfilter_ipv6.c

index 6b07f30..afd1c71 100644 (file)
  */
 static int br_nf_check_hbh_len(struct sk_buff *skb)
 {
-       unsigned char *raw = (u8 *)(ipv6_hdr(skb) + 1);
+       int len, off = sizeof(struct ipv6hdr);
+       unsigned char *nh;
        u32 pkt_len;
-       const unsigned char *nh = skb_network_header(skb);
-       int off = raw - nh;
-       int len = (raw[1] + 1) << 3;
 
-       if ((raw + len) - skb->data > skb_headlen(skb))
+       if (!pskb_may_pull(skb, off + 8))
                goto bad;
+       nh = (unsigned char *)(ipv6_hdr(skb) + 1);
+       len = (nh[1] + 1) << 3;
+
+       if (!pskb_may_pull(skb, off + len))
+               goto bad;
+       nh = skb_network_header(skb);
 
        off += 2;
        len -= 2;