mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	ipv6: sctp: add rcu protection around np->opt
This patch completes the work I did in commit 45f6fad84c
("ipv6: add complete rcu protection around np->opt"), as I missed
sctp part.
This simply makes sure np->opt is used with proper RCU locking
and accessors.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									6adc5fd6a1
								
							
						
					
					
						commit
						c836a8ba93
					
				
					 1 changed files with 10 additions and 3 deletions
				
			
		|  | @ -209,6 +209,7 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport) | |||
| 	struct sock *sk = skb->sk; | ||||
| 	struct ipv6_pinfo *np = inet6_sk(sk); | ||||
| 	struct flowi6 *fl6 = &transport->fl.u.ip6; | ||||
| 	int res; | ||||
| 
 | ||||
| 	pr_debug("%s: skb:%p, len:%d, src:%pI6 dst:%pI6\n", __func__, skb, | ||||
| 		 skb->len, &fl6->saddr, &fl6->daddr); | ||||
|  | @ -220,7 +221,10 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport) | |||
| 
 | ||||
| 	SCTP_INC_STATS(sock_net(sk), SCTP_MIB_OUTSCTPPACKS); | ||||
| 
 | ||||
| 	return ip6_xmit(sk, skb, fl6, np->opt, np->tclass); | ||||
| 	rcu_read_lock(); | ||||
| 	res = ip6_xmit(sk, skb, fl6, rcu_dereference(np->opt), np->tclass); | ||||
| 	rcu_read_unlock(); | ||||
| 	return res; | ||||
| } | ||||
| 
 | ||||
| /* Returns the dst cache entry for the given source and destination ip
 | ||||
|  | @ -262,7 +266,10 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, | |||
| 		pr_debug("src=%pI6 - ", &fl6->saddr); | ||||
| 	} | ||||
| 
 | ||||
| 	final_p = fl6_update_dst(fl6, np->opt, &final); | ||||
| 	rcu_read_lock(); | ||||
| 	final_p = fl6_update_dst(fl6, rcu_dereference(np->opt), &final); | ||||
| 	rcu_read_unlock(); | ||||
| 
 | ||||
| 	dst = ip6_dst_lookup_flow(sk, fl6, final_p); | ||||
| 	if (!asoc || saddr) | ||||
| 		goto out; | ||||
|  | @ -321,7 +328,7 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr, | |||
| 	if (baddr) { | ||||
| 		fl6->saddr = baddr->v6.sin6_addr; | ||||
| 		fl6->fl6_sport = baddr->v6.sin6_port; | ||||
| 		final_p = fl6_update_dst(fl6, np->opt, &final); | ||||
| 		final_p = fl6_update_dst(fl6, rcu_dereference(np->opt), &final); | ||||
| 		dst = ip6_dst_lookup_flow(sk, fl6, final_p); | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Eric Dumazet
						Eric Dumazet