|
@@ -641,6 +641,7 @@ static struct sock *sctp_v6_create_accept_sk(struct sock *sk,
|
|
struct sock *newsk;
|
|
struct sock *newsk;
|
|
struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
|
|
struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
|
|
struct sctp6_sock *newsctp6sk;
|
|
struct sctp6_sock *newsctp6sk;
|
|
|
|
+ struct ipv6_txoptions *opt;
|
|
|
|
|
|
newsk = sk_alloc(sock_net(sk), PF_INET6, GFP_KERNEL, sk->sk_prot, 0);
|
|
newsk = sk_alloc(sock_net(sk), PF_INET6, GFP_KERNEL, sk->sk_prot, 0);
|
|
if (!newsk)
|
|
if (!newsk)
|
|
@@ -660,6 +661,13 @@ static struct sock *sctp_v6_create_accept_sk(struct sock *sk,
|
|
|
|
|
|
memcpy(newnp, np, sizeof(struct ipv6_pinfo));
|
|
memcpy(newnp, np, sizeof(struct ipv6_pinfo));
|
|
|
|
|
|
|
|
+ rcu_read_lock();
|
|
|
|
+ opt = rcu_dereference(np->opt);
|
|
|
|
+ if (opt)
|
|
|
|
+ opt = ipv6_dup_options(newsk, opt);
|
|
|
|
+ RCU_INIT_POINTER(newnp->opt, opt);
|
|
|
|
+ rcu_read_unlock();
|
|
|
|
+
|
|
/* Initialize sk's sport, dport, rcv_saddr and daddr for getsockname()
|
|
/* Initialize sk's sport, dport, rcv_saddr and daddr for getsockname()
|
|
* and getpeername().
|
|
* and getpeername().
|
|
*/
|
|
*/
|