mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-15 08:44:14 +08: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
@ -209,6 +209,7 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport)
|
|||||||
struct sock *sk = skb->sk;
|
struct sock *sk = skb->sk;
|
||||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||||
struct flowi6 *fl6 = &transport->fl.u.ip6;
|
struct flowi6 *fl6 = &transport->fl.u.ip6;
|
||||||
|
int res;
|
||||||
|
|
||||||
pr_debug("%s: skb:%p, len:%d, src:%pI6 dst:%pI6\n", __func__, skb,
|
pr_debug("%s: skb:%p, len:%d, src:%pI6 dst:%pI6\n", __func__, skb,
|
||||||
skb->len, &fl6->saddr, &fl6->daddr);
|
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);
|
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
|
/* 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);
|
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);
|
dst = ip6_dst_lookup_flow(sk, fl6, final_p);
|
||||||
if (!asoc || saddr)
|
if (!asoc || saddr)
|
||||||
goto out;
|
goto out;
|
||||||
@ -321,7 +328,7 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
|
|||||||
if (baddr) {
|
if (baddr) {
|
||||||
fl6->saddr = baddr->v6.sin6_addr;
|
fl6->saddr = baddr->v6.sin6_addr;
|
||||||
fl6->fl6_sport = baddr->v6.sin6_port;
|
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);
|
dst = ip6_dst_lookup_flow(sk, fl6, final_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user