diff options
| -rw-r--r-- | net/ipv4/inet_connection_sock.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index db0cf17c00f7..7f75f21d7b83 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
| @@ -404,12 +404,15 @@ struct dst_entry *inet_csk_route_child_sock(struct sock *sk, | |||
| 404 | { | 404 | { |
| 405 | const struct inet_request_sock *ireq = inet_rsk(req); | 405 | const struct inet_request_sock *ireq = inet_rsk(req); |
| 406 | struct inet_sock *newinet = inet_sk(newsk); | 406 | struct inet_sock *newinet = inet_sk(newsk); |
| 407 | struct ip_options_rcu *opt = ireq->opt; | 407 | struct ip_options_rcu *opt; |
| 408 | struct net *net = sock_net(sk); | 408 | struct net *net = sock_net(sk); |
| 409 | struct flowi4 *fl4; | 409 | struct flowi4 *fl4; |
| 410 | struct rtable *rt; | 410 | struct rtable *rt; |
| 411 | 411 | ||
| 412 | fl4 = &newinet->cork.fl.u.ip4; | 412 | fl4 = &newinet->cork.fl.u.ip4; |
| 413 | |||
| 414 | rcu_read_lock(); | ||
| 415 | opt = rcu_dereference(newinet->inet_opt); | ||
| 413 | flowi4_init_output(fl4, sk->sk_bound_dev_if, sk->sk_mark, | 416 | flowi4_init_output(fl4, sk->sk_bound_dev_if, sk->sk_mark, |
| 414 | RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE, | 417 | RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE, |
| 415 | sk->sk_protocol, inet_sk_flowi_flags(sk), | 418 | sk->sk_protocol, inet_sk_flowi_flags(sk), |
| @@ -421,11 +424,13 @@ struct dst_entry *inet_csk_route_child_sock(struct sock *sk, | |||
| 421 | goto no_route; | 424 | goto no_route; |
| 422 | if (opt && opt->opt.is_strictroute && rt->rt_gateway) | 425 | if (opt && opt->opt.is_strictroute && rt->rt_gateway) |
| 423 | goto route_err; | 426 | goto route_err; |
| 427 | rcu_read_unlock(); | ||
| 424 | return &rt->dst; | 428 | return &rt->dst; |
| 425 | 429 | ||
| 426 | route_err: | 430 | route_err: |
| 427 | ip_rt_put(rt); | 431 | ip_rt_put(rt); |
| 428 | no_route: | 432 | no_route: |
| 433 | rcu_read_unlock(); | ||
| 429 | IP_INC_STATS_BH(net, IPSTATS_MIB_OUTNOROUTES); | 434 | IP_INC_STATS_BH(net, IPSTATS_MIB_OUTNOROUTES); |
| 430 | return NULL; | 435 | return NULL; |
| 431 | } | 436 | } |
