|
@@ -464,10 +464,12 @@ static int l2tp_ip_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m
|
|
sk->sk_bound_dev_if);
|
|
sk->sk_bound_dev_if);
|
|
if (IS_ERR(rt))
|
|
if (IS_ERR(rt))
|
|
goto no_route;
|
|
goto no_route;
|
|
- if (connected)
|
|
|
|
|
|
+ if (connected) {
|
|
sk_setup_caps(sk, &rt->dst);
|
|
sk_setup_caps(sk, &rt->dst);
|
|
- else
|
|
|
|
- dst_release(&rt->dst); /* safe since we hold rcu_read_lock */
|
|
|
|
|
|
+ } else {
|
|
|
|
+ skb_dst_set(skb, &rt->dst);
|
|
|
|
+ goto xmit;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/* We dont need to clone dst here, it is guaranteed to not disappear.
|
|
/* We dont need to clone dst here, it is guaranteed to not disappear.
|
|
@@ -475,6 +477,7 @@ static int l2tp_ip_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *m
|
|
*/
|
|
*/
|
|
skb_dst_set_noref(skb, &rt->dst);
|
|
skb_dst_set_noref(skb, &rt->dst);
|
|
|
|
|
|
|
|
+xmit:
|
|
/* Queue the packet to IP for output */
|
|
/* Queue the packet to IP for output */
|
|
rc = ip_queue_xmit(skb, &inet->cork.fl);
|
|
rc = ip_queue_xmit(skb, &inet->cork.fl);
|
|
rcu_read_unlock();
|
|
rcu_read_unlock();
|