You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by li...@apache.org on 2006/11/30 08:30:30 UTC

svn commit: r480867 - in /harmony/enhanced/classlib/trunk/modules/luni/src: main/java/java/net/InetAddress.java test/java/org/apache/harmony/luni/tests/java/net/InetAddressTest.java

Author: liangyx
Date: Wed Nov 29 23:30:28 2006
New Revision: 480867

URL: http://svn.apache.org/viewvc?view=rev&rev=480867
Log:
Apply patch for HARMONY-2290 ([classlib][luni]InetAddress.isReachable(NetworkInterface,int,int) throws NullPointerExeption when the networkInterface is not bind to a network address)

Modified:
    harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/InetAddress.java
    harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/net/InetAddressTest.java

Modified: harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/InetAddress.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/InetAddress.java?view=diff&rev=480867&r1=480866&r2=480867
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/InetAddress.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/net/InetAddress.java Wed Nov 29 23:30:28 2006
@@ -792,6 +792,10 @@
                 reachable = isReachableByTCP(this, null, timeout);
             }
         } else {
+            //Not Bind to any address
+            if (null == netif.addresses) {
+                return false;
+            }                               
             // binds to all address on this NetworkInterface, tries ICMP ping
             // first
             reachable = isReachableByICMPUseMultiThread(netif, ttl, timeout);
@@ -813,20 +817,42 @@
         Enumeration<InetAddress> addresses = netif.getInetAddresses();
         reached = false;
         addrCount = netif.addresses.length;
+        boolean needWait = false;
         while (addresses.hasMoreElements()) {
             final InetAddress addr = addresses.nextElement();
+            
+            //loopback interface can only reach to local addresses
+            if(addr.isLoopbackAddress())
+            {
+                Enumeration<NetworkInterface> NetworkInterfaces = NetworkInterface.getNetworkInterfaces();
+                while(NetworkInterfaces.hasMoreElements())
+                {
+                    NetworkInterface networkInterface = NetworkInterfaces.nextElement();
+                    Enumeration<InetAddress> localAddresses = networkInterface.getInetAddresses();
+                    while(localAddresses.hasMoreElements())
+                    {
+                        if(InetAddress.this.equals(localAddresses.nextElement()))
+                        {
+                            return true;
+                        }
+                    }                    
+                }
+                continue;
+            }
+            
+            needWait = true;
             new Thread() {
                 @Override
                 public void run() {
                     boolean threadReached = false;
                     // if isICMP, tries ICMP ping, else TCP echo
                     if (isICMP) {
-                        threadReached = NETIMPL.isReachableByICMP(addr,
-                                InetAddress.this, ttl, timeout);
+                        threadReached = NETIMPL.isReachableByICMP(
+                                InetAddress.this, addr, ttl, timeout);
                     } else {
                         try {
-                            threadReached = isReachableByTCP(addr,
-                                    InetAddress.this, timeout);
+                            threadReached = isReachableByTCP(
+                                    InetAddress.this, addr, timeout);
                         } catch (IOException e) {
                             // do nothing
                         }
@@ -850,14 +876,20 @@
                 }
             }.start();
         }
-        synchronized (waitReachable) {
-            try {
-                // wait for notification
-                waitReachable.wait();
-            } catch (InterruptedException e) {
-                // do nothing
+        
+        if (needWait) {
+            synchronized (waitReachable) {
+                try {
+                    // wait for notification
+                    waitReachable.wait();
+                } catch (InterruptedException e) {
+                    // do nothing
+                }
+                return reached;
             }
-            return reached;
+        }
+        else {
+            return false;
         }
     }    
 

Modified: harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/net/InetAddressTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/net/InetAddressTest.java?view=diff&rev=480867&r1=480866&r2=480867
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/net/InetAddressTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/net/InetAddressTest.java Wed Nov 29 23:30:28 2006
@@ -17,12 +17,16 @@
 
 package org.apache.harmony.luni.tests.java.net;
 
+import java.io.IOException;
 import java.io.Serializable;
 import java.net.DatagramSocket;
 import java.net.Inet4Address;
 import java.net.InetAddress;
+import java.net.NetworkInterface;
 import java.net.UnknownHostException;
 import java.security.Permission;
+import java.util.ArrayList;
+import java.util.Enumeration;
 
 import org.apache.harmony.testframework.serialization.SerializationTest;
 import org.apache.harmony.testframework.serialization.SerializationTest.SerializableAssert;
@@ -500,6 +504,41 @@
             assertEquals(initAddr.getHostName(), desrAddr.getHostName());
         }
     };
+    
+    // Regression Test for Harmony-2290
+    public void test_isReachableLjava_net_NetworkInterfaceII_loopbackInterface() throws IOException {
+        final int TTL = 20;
+        final int TIME_OUT = 3000;
+        
+        NetworkInterface loopbackInterface = null;
+        ArrayList<InetAddress> localAddresses = new ArrayList<InetAddress>();
+        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface
+                .getNetworkInterfaces();
+        while (networkInterfaces.hasMoreElements()) {
+            NetworkInterface networkInterface = networkInterfaces.nextElement();
+            Enumeration<InetAddress> addresses = networkInterface
+                    .getInetAddresses();
+            while (addresses.hasMoreElements()) {
+                InetAddress address = addresses.nextElement();
+                if (address.isLoopbackAddress()) {
+                    loopbackInterface = networkInterface;
+                } else {
+                    localAddresses.add(address);
+                }
+            }
+        }
+
+        //loopbackInterface can reach local address
+        if (null != loopbackInterface) {
+            for (InetAddress destAddress : localAddresses) {
+                assertTrue(destAddress.isReachable(loopbackInterface, TTL, TIME_OUT));
+            }
+        }
+
+        //loopback Interface cannot reach outside address
+        InetAddress destAddress = InetAddress.getByName("www.google.com");
+        assertFalse(destAddress.isReachable(loopbackInterface, TTL, TIME_OUT));
+    }
 
     /**
      * @tests serialization/deserialization compatibility.