case NDISC_NEIGHBOUR_SOLICITATION:
case NDISC_NEIGHBOUR_ADVERTISEMENT:
case NDISC_REDIRECT:
- if (skb_is_nonlinear(skb) &&
- skb_linearize(skb, GFP_ATOMIC) != 0) {
- kfree_skb(skb);
- return 0;
- }
-
ndisc_rcv(skb);
break;
struct inet6_ifaddr *ifp;
struct neighbour *neigh;
- if (skb->len < sizeof(struct nd_msg)) {
- if (net_ratelimit())
- printk(KERN_WARNING "ICMP NS: packet too short\n");
- return;
- }
-
if (ipv6_addr_type(&msg->target)&IPV6_ADDR_MULTICAST) {
if (net_ratelimit())
printk(KERN_WARNING "ICMP NS: target address is multicast\n");
int ndisc_rcv(struct sk_buff *skb)
{
- struct nd_msg *msg = (struct nd_msg *) skb->h.raw;
+ struct nd_msg *msg;
+
+ if (!pskb_may_pull(skb, skb->len))
+ return 0;
+
+ msg = (struct nd_msg *) skb->h.raw;
__skb_push(skb, skb->data-skb->h.raw);