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