diff options
Diffstat (limited to 'net/core')
| -rw-r--r-- | net/core/neighbour.c | 8 | ||||
| -rw-r--r-- | net/core/netpoll.c | 4 |
2 files changed, 9 insertions, 3 deletions
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 8fab9b0bb203..1334d7e56f02 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -1319,11 +1319,15 @@ static void neigh_proxy_process(unsigned long arg) | |||
| 1319 | 1319 | ||
| 1320 | if (tdif <= 0) { | 1320 | if (tdif <= 0) { |
| 1321 | struct net_device *dev = skb->dev; | 1321 | struct net_device *dev = skb->dev; |
| 1322 | |||
| 1322 | __skb_unlink(skb, &tbl->proxy_queue); | 1323 | __skb_unlink(skb, &tbl->proxy_queue); |
| 1323 | if (tbl->proxy_redo && netif_running(dev)) | 1324 | if (tbl->proxy_redo && netif_running(dev)) { |
| 1325 | rcu_read_lock(); | ||
| 1324 | tbl->proxy_redo(skb); | 1326 | tbl->proxy_redo(skb); |
| 1325 | else | 1327 | rcu_read_unlock(); |
| 1328 | } else { | ||
| 1326 | kfree_skb(skb); | 1329 | kfree_skb(skb); |
| 1330 | } | ||
| 1327 | 1331 | ||
| 1328 | dev_put(dev); | 1332 | dev_put(dev); |
| 1329 | } else if (!sched_next || tdif < sched_next) | 1333 | } else if (!sched_next || tdif < sched_next) |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index adf84dd8c7b5..52622517e0d8 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -558,13 +558,14 @@ int __netpoll_rx(struct sk_buff *skb) | |||
| 558 | if (skb_shared(skb)) | 558 | if (skb_shared(skb)) |
| 559 | goto out; | 559 | goto out; |
| 560 | 560 | ||
| 561 | iph = (struct iphdr *)skb->data; | ||
| 562 | if (!pskb_may_pull(skb, sizeof(struct iphdr))) | 561 | if (!pskb_may_pull(skb, sizeof(struct iphdr))) |
| 563 | goto out; | 562 | goto out; |
| 563 | iph = (struct iphdr *)skb->data; | ||
| 564 | if (iph->ihl < 5 || iph->version != 4) | 564 | if (iph->ihl < 5 || iph->version != 4) |
| 565 | goto out; | 565 | goto out; |
| 566 | if (!pskb_may_pull(skb, iph->ihl*4)) | 566 | if (!pskb_may_pull(skb, iph->ihl*4)) |
| 567 | goto out; | 567 | goto out; |
| 568 | iph = (struct iphdr *)skb->data; | ||
| 568 | if (ip_fast_csum((u8 *)iph, iph->ihl) != 0) | 569 | if (ip_fast_csum((u8 *)iph, iph->ihl) != 0) |
| 569 | goto out; | 570 | goto out; |
| 570 | 571 | ||
| @@ -579,6 +580,7 @@ int __netpoll_rx(struct sk_buff *skb) | |||
| 579 | if (pskb_trim_rcsum(skb, len)) | 580 | if (pskb_trim_rcsum(skb, len)) |
| 580 | goto out; | 581 | goto out; |
| 581 | 582 | ||
| 583 | iph = (struct iphdr *)skb->data; | ||
| 582 | if (iph->protocol != IPPROTO_UDP) | 584 | if (iph->protocol != IPPROTO_UDP) |
| 583 | goto out; | 585 | goto out; |
| 584 | 586 | ||
