diff --git a/net/wireless/util.c b/net/wireless/util.c index 23bca5e687c1..c310876c6c72 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -963,13 +963,23 @@ unsigned int cfg80211_classify8021d(struct sk_buff *skb, switch (skb->protocol) { case htons(ETH_P_IP): - if (!pskb_may_pull(skb, sizeof(struct iphdr))) + struct iphdr iph, *ip; + + ip = skb_header_pointer(skb, sizeof(struct ethhdr), + sizeof(*ip), &iph); + if (!ip) return 0; + dscp = ipv4_get_dsfield(ip_hdr(skb)) & 0xfc; break; case htons(ETH_P_IPV6): - if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) + struct ip6hdr ip6h, *ip6; + + ip6 = skb_header_pointer(skb, sizeof(struct ethhdr), + sizeof(*ip6), &ip6h); + if (!ip6) return 0; + dscp = ipv6_get_dsfield(ipv6_hdr(skb)) & 0xfc; break; case htons(ETH_P_MPLS_UC):