6707289: InterfaceAddress.getNetworkPrefixLength() does not conform to Javadoc
Reviewed-by: michaelm
--- a/jdk/src/windows/native/java/net/NetworkInterface_winXP.c Fri Jan 22 00:02:08 2010 +0000
+++ b/jdk/src/windows/native/java/net/NetworkInterface_winXP.c Mon Jan 25 15:41:37 2010 +0000
@@ -172,7 +172,7 @@
DWORD ret;
IP_ADAPTER_ADDRESSES *ptr, *adapters=0;
ULONG len=ipinflen, count=0;
- netif *nif=0, *dup_nif, *last=0, *loopif=0;
+ netif *nif=0, *dup_nif, *last=0, *loopif=0, *curr;
int tun=0, net=0;
*netifPP = 0;
@@ -197,6 +197,20 @@
last = nif;
}
+ // Retrieve IPv4 addresses with the IP Helper API
+ curr = *netifPP;
+ while (curr != NULL) {
+ netaddr *netaddrP;
+ ret = enumAddresses_win(env, curr, &netaddrP);
+ if ((*env)->ExceptionOccurred(env)) {
+ free_netaddr(netaddrP);
+ return -1;
+ }
+ curr->addrs = netaddrP;
+ curr->naddrs += ret;
+ curr = curr->next;
+ }
+
ret = getAdapters (env, &adapters);
if (ret != ERROR_SUCCESS) {
goto err;
@@ -350,6 +364,14 @@
/* address is only usable if dad state is preferred or deprecated */
if (uni_addr->DadState == IpDadStateDeprecated ||
uni_addr->DadState == IpDadStatePreferred) {
+ sock = uni_addr->Address.lpSockaddr;
+
+ // IPv4 addresses already retrieved with enumAddresses_win
+ if (sock->sa_family == AF_INET) {
+ uni_addr = uni_addr->Next;
+ continue;
+ }
+
curr = (netaddr *)calloc (1, sizeof (netaddr));
if (curr == 0) {
return -1;
@@ -361,15 +383,9 @@
prev->next = curr;
}
prev = curr;
- sock = uni_addr->Address.lpSockaddr;
SOCKETADDRESS_COPY (&curr->addr, sock);
if (prefix != NULL) {
curr->mask = (short)prefix->PrefixLength;
- if (sock->sa_family == AF_INET) {
- sock = prefix->Address.lpSockaddr;
- SOCKETADDRESS_COPY(&curr->brdcast, sock);
- curr->brdcast.him4.sin_addr.s_addr |= htonl((0xffffffff >> curr->mask));
- }
prefix = prefix->Next;
}
count ++;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/InterfaceAddress/NetworkPrefixLength.java Mon Jan 25 15:41:37 2010 +0000
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc. 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 6707289
+ * @summary InterfaceAddress.getNetworkPrefixLength() does not conform to Javadoc
+ */
+
+import java.net.InetAddress;
+import java.net.Inet4Address;
+import java.net.InterfaceAddress;
+import java.net.NetworkInterface;
+import java.util.Enumeration;
+import static java.lang.System.out;
+
+public class NetworkPrefixLength {
+ static boolean passed = true;
+
+ public static void main(String[] args) throws Exception {
+ Enumeration<NetworkInterface> nics = NetworkInterface.getNetworkInterfaces();
+
+ while (nics.hasMoreElements()) {
+ NetworkInterface nic = nics.nextElement();
+ for (InterfaceAddress iaddr : nic.getInterfaceAddresses()) {
+ boolean valid = checkPrefix(iaddr);
+ if (!valid) {
+ passed = false;
+ debug(nic.getName(), iaddr);
+ }
+ }
+ }
+
+ if (!passed)
+ throw new RuntimeException("Failed: some interfaces have invalid prefix lengths");
+ }
+
+ static boolean checkPrefix(InterfaceAddress iaddr) {
+ InetAddress addr = iaddr.getAddress();
+
+ if (addr instanceof Inet4Address)
+ return checkIPv4PrefixLength(iaddr.getNetworkPrefixLength());
+ else
+ return checkIPv6PrefixLength(iaddr.getNetworkPrefixLength());
+ }
+
+ static boolean checkIPv4PrefixLength(int prefix) {
+ if (prefix >=0 && prefix <= 32)
+ return true;
+
+ return false;
+ }
+
+ static boolean checkIPv6PrefixLength(int prefix) {
+ if (prefix >=0 && prefix <= 128)
+ return true;
+
+ return false;
+ }
+
+ static void debug(String nicName, InterfaceAddress iaddr) {
+ out.println("NIC " + nicName + " has an address with an invalid prefix length:\n" + iaddr);
+ }
+}
+