diff options
Diffstat (limited to 'net/ipv4/route.c')
| -rw-r--r-- | net/ipv4/route.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 8549f26e2495..381dd6a6aebb 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -2128,7 +2128,7 @@ int ip_route_input(struct sk_buff *skb, u32 daddr, u32 saddr, | |||
| 2128 | struct in_device *in_dev; | 2128 | struct in_device *in_dev; |
| 2129 | 2129 | ||
| 2130 | rcu_read_lock(); | 2130 | rcu_read_lock(); |
| 2131 | if ((in_dev = __in_dev_get(dev)) != NULL) { | 2131 | if ((in_dev = __in_dev_get_rcu(dev)) != NULL) { |
| 2132 | int our = ip_check_mc(in_dev, daddr, saddr, | 2132 | int our = ip_check_mc(in_dev, daddr, saddr, |
| 2133 | skb->nh.iph->protocol); | 2133 | skb->nh.iph->protocol); |
| 2134 | if (our | 2134 | if (our |
| @@ -2443,7 +2443,9 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp) | |||
| 2443 | err = -ENODEV; | 2443 | err = -ENODEV; |
| 2444 | if (dev_out == NULL) | 2444 | if (dev_out == NULL) |
| 2445 | goto out; | 2445 | goto out; |
| 2446 | if (__in_dev_get(dev_out) == NULL) { | 2446 | |
| 2447 | /* RACE: Check return value of inet_select_addr instead. */ | ||
| 2448 | if (__in_dev_get_rtnl(dev_out) == NULL) { | ||
| 2447 | dev_put(dev_out); | 2449 | dev_put(dev_out); |
| 2448 | goto out; /* Wrong error code */ | 2450 | goto out; /* Wrong error code */ |
| 2449 | } | 2451 | } |
