sctp: ipv6: avoid touching device refcount
Subsystems (3)
PATCH 1/1 sctp: ipv6: avoid touching device refcount
Avoid touching device refcount in sctp/ipv6, thanks to RCU
Signed-off-by Eric Dumazet <[email protected]>
--- net/sctp/ipv6.c | 19 +++++++++++-------- 1 files changed, 11 insertions(+), 8 deletions(-)
net/sctp/ipv6.c +11 -8
@@ -837,15 +837,16 @@ static int sctp_inet6_bind_verify(struct sctp_sock *opt, union sctp_addr *addr)if (type &IPV6_ADDR_LINKLOCAL ) {if (!addr->v6.sin6_scope_id)return 0 ; - dev =dev_get_by_index (&init_net, addr->v6.sin6_scope_id); -if (!dev) -return 0 ; -if (!ipv6_chk_addr (&init_net, &addr->v6.sin6_addr, +rcu_read_lock (); + dev =dev_get_by_index_rcu (&init_net, + addr->v6.sin6_scope_id); +if (!dev || + !ipv6_chk_addr (&init_net, &addr->v6.sin6_addr, dev,0 )) { -dev_put (dev); +rcu_read_unlock ();return 0 ; } -dev_put (dev); +rcu_read_unlock (); }else if (type ==IPV6_ADDR_MAPPED ) {if (!opt->v4mapped)return 0 ;
@@ -873,10 +874,12 @@ static int sctp_inet6_send_verify(struct sctp_sock *opt, union sctp_addr *addr)if (type &IPV6_ADDR_LINKLOCAL ) {if (!addr->v6.sin6_scope_id)return 0 ; - dev =dev_get_by_index (&init_net, addr->v6.sin6_scope_id); +rcu_read_lock (); + dev =dev_get_by_index_rcu (&init_net, + addr->v6.sin6_scope_id); +rcu_read_unlock ();if (!dev)return 0 ; -dev_put (dev); } af = opt->pf->af; }
From: Eric Dumazet <[email protected]>
Date: Wed, 04 Nov 2009 22:06:02 +0100
Quoted 3 lines
Avoid touching device refcount in sctp/ipv6, thanks to RCU
Signed-off-by Eric Dumazet <[email protected]>
Applied to net-next-2.6