--- old/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java 2020-01-06 11:04:29.000000000 +0000 +++ new/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java 2020-01-06 11:04:28.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1405,10 +1405,11 @@ registry.forEach(k -> { if (k instanceof MembershipKeyImpl.Type6) { MembershipKeyImpl.Type6 key6 = (MembershipKeyImpl.Type6) k; - Net.join6(fd, key6.groupAddress(), key6.index(), key6.source()); + Net.join6(fd, key6.groupAddress(), key6.interfaceIndex(), key6.source()); } else { MembershipKeyImpl.Type4 key4 = (MembershipKeyImpl.Type4) k; - Net.join4(fd, key4.groupAddress(), key4.interfaceAddress(), key4.source()); + Net.join4(fd, key4.groupAddress(), key4.interfaceIndex(), + key4.interfaceAddress(), key4.source()); } }); } @@ -1466,6 +1467,10 @@ throw new IllegalArgumentException("Address type not supported"); } + // network interface, should always be >= 0 + int index = interf.getIndex(); + assert index >= 0; + // check source address if (source != null) { if (source.isAnyLocalAddress()) @@ -1497,14 +1502,9 @@ if ((family == StandardProtocolFamily.INET6) && ((group instanceof Inet6Address) || Net.canJoin6WithIPv4Group())) { - int index = interf.getIndex(); - if (index == -1) - throw new IOException("Network interface cannot be identified"); - // need multicast and source address as byte arrays byte[] groupAddress = Net.inet6AsByteArray(group); - byte[] sourceAddress = (source == null) ? null : - Net.inet6AsByteArray(source); + byte[] sourceAddress = (source == null) ? null : Net.inet6AsByteArray(source); // join the group int n = Net.join6(fd, groupAddress, index, sourceAddress); @@ -1512,8 +1512,7 @@ throw new UnsupportedOperationException(); key = new MembershipKeyImpl.Type6(this, group, interf, source, - groupAddress, index, sourceAddress); - + groupAddress, sourceAddress); } else { // need IPv4 address to identify interface Inet4Address target = Net.anyInet4Address(interf); @@ -1525,7 +1524,7 @@ int sourceAddress = (source == null) ? 0 : Net.inet4AsInt(source); // join the group - int n = Net.join4(fd, groupAddress, targetAddress, sourceAddress); + int n = Net.join4(fd, groupAddress, index, targetAddress, sourceAddress); if (n == IOStatus.UNAVAILABLE) throw new UnsupportedOperationException(); @@ -1539,17 +1538,14 @@ } @Override - public MembershipKey join(InetAddress group, - NetworkInterface interf) + public MembershipKey join(InetAddress group, NetworkInterface interf) throws IOException { return innerJoin(group, interf, null); } @Override - public MembershipKey join(InetAddress group, - NetworkInterface interf, - InetAddress source) + public MembershipKey join(InetAddress group, NetworkInterface interf, InetAddress source) throws IOException { Objects.requireNonNull(source); @@ -1566,13 +1562,12 @@ try { if (key instanceof MembershipKeyImpl.Type6) { - MembershipKeyImpl.Type6 key6 = - (MembershipKeyImpl.Type6)key; - Net.drop6(fd, key6.groupAddress(), key6.index(), key6.source()); + MembershipKeyImpl.Type6 key6 = (MembershipKeyImpl.Type6)key; + Net.drop6(fd, key6.groupAddress(), key6.interfaceIndex(), key6.source()); } else { MembershipKeyImpl.Type4 key4 = (MembershipKeyImpl.Type4)key; - Net.drop4(fd, key4.groupAddress(), key4.interfaceAddress(), - key4.source()); + Net.drop4(fd, key4.groupAddress(), key4.interfaceIndex(), + key4.interfaceAddress(), key4.source()); } } catch (IOException ioe) { // should not happen @@ -1623,13 +1618,13 @@ if (key instanceof MembershipKeyImpl.Type6) { MembershipKeyImpl.Type6 key6 = (MembershipKeyImpl.Type6)key; - n = Net.block6(fd, key6.groupAddress(), key6.index(), + n = Net.block6(fd, key6.groupAddress(), key6.interfaceIndex(), Net.inet6AsByteArray(source)); } else { MembershipKeyImpl.Type4 key4 = (MembershipKeyImpl.Type4)key; - n = Net.block4(fd, key4.groupAddress(), key4.interfaceAddress(), - Net.inet4AsInt(source)); + n = Net.block4(fd, key4.groupAddress(), key4.interfaceIndex(), + key4.interfaceAddress(), Net.inet4AsInt(source)); } if (n == IOStatus.UNAVAILABLE) { // ancient kernel @@ -1651,15 +1646,13 @@ try { if (key instanceof MembershipKeyImpl.Type6) { - MembershipKeyImpl.Type6 key6 = - (MembershipKeyImpl.Type6)key; - Net.unblock6(fd, key6.groupAddress(), key6.index(), + MembershipKeyImpl.Type6 key6 = (MembershipKeyImpl.Type6)key; + Net.unblock6(fd, key6.groupAddress(), key6.interfaceIndex(), Net.inet6AsByteArray(source)); } else { - MembershipKeyImpl.Type4 key4 = - (MembershipKeyImpl.Type4)key; - Net.unblock4(fd, key4.groupAddress(), key4.interfaceAddress(), - Net.inet4AsInt(source)); + MembershipKeyImpl.Type4 key4 = (MembershipKeyImpl.Type4)key; + Net.unblock4(fd, key4.groupAddress(), key4.interfaceIndex(), + key4.interfaceAddress(), Net.inet4AsInt(source)); } } catch (IOException ioe) { // should not happen