@ -205,26 +205,27 @@ int sctp_copy_local_addr_list(struct net *net, struct sctp_bind_addr *bp,
list_for_each_entry_rcu ( addr , & net - > sctp . local_addr_list , list ) {
if ( ! addr - > valid )
continue ;
if ( sctp_in_scope ( net , & addr - > a , scope ) ) {
/* Now that the address is in scope, check to see if
* the address type is really supported by the local
* sock as well as the remote peer .
*/
if ( ( ( ( AF_INET = = addr - > a . sa . sa_family ) & &
( copy_flags & SCTP_ADDR4_PEERSUPP ) ) ) | |
( ( ( AF_INET6 = = addr - > a . sa . sa_family ) & &
( copy_flags & SCTP_ADDR6_ALLOWED ) & &
( copy_flags & SCTP_ADDR6_PEERSUPP ) ) ) ) {
error = sctp_add_bind_addr ( bp , & addr - > a ,
sizeof ( addr - > a ) ,
SCTP_ADDR_SRC , GFP_ATOMIC ) ;
if ( error )
goto end_copy ;
}
}
if ( ! sctp_in_scope ( net , & addr - > a , scope ) )
continue ;
/* Now that the address is in scope, check to see if
* the address type is really supported by the local
* sock as well as the remote peer .
*/
if ( addr - > a . sa . sa_family = = AF_INET & &
! ( copy_flags & SCTP_ADDR4_PEERSUPP ) )
continue ;
if ( addr - > a . sa . sa_family = = AF_INET6 & &
( ! ( copy_flags & SCTP_ADDR6_ALLOWED ) | |
! ( copy_flags & SCTP_ADDR6_PEERSUPP ) ) )
continue ;
error = sctp_add_bind_addr ( bp , & addr - > a , sizeof ( addr - > a ) ,
SCTP_ADDR_SRC , GFP_ATOMIC ) ;
if ( error )
break ;
}
end_copy :
rcu_read_unlock ( ) ;
return error ;
}