8210493: Bind to node- or linklocal ipv6 multicast address fails

Reviewed-by: alanb, chegar
This commit is contained in:
Pavel Rappo 2018-11-12 12:55:36 +00:00
parent 9429c17b35
commit cea9c21479
3 changed files with 401 additions and 3 deletions

View file

@ -803,8 +803,12 @@ NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port,
#ifdef __linux__
/*
* On Linux if we are connecting to a link-local address
* we need to specify the interface in the scope_id (2.4 kernel only)
* On Linux if we are connecting to a
*
* - link-local address
* - multicast interface-local or link-local address
*
* we need to specify the interface in the scope_id.
*
* If the scope was cached then we use the cached value. If not cached but
* specified in the Inet6Address we use that, but we first check if the
@ -814,7 +818,9 @@ NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port,
* we try to determine a value from the routing table. In all these
* cases the used value is cached for further use.
*/
if (IN6_IS_ADDR_LINKLOCAL(&sa->sa6.sin6_addr)) {
if (IN6_IS_ADDR_LINKLOCAL(&sa->sa6.sin6_addr)
|| IN6_IS_ADDR_MC_NODELOCAL(&sa->sa6.sin6_addr)
|| IN6_IS_ADDR_MC_LINKLOCAL(&sa->sa6.sin6_addr)) {
unsigned int cached_scope_id = 0, scope_id = 0;
if (ia6_cachedscopeidID) {