[kaffe] java.net.Socket#getLocalAddress() should return anylocal if not bound

Ito Kazumitsu ito.kazumitsu at mail.hidec.co.jp
Tue Sep 14 00:34:13 PDT 2004


Hi,

While running Jetty 4.2.20 with kaffe
(ChangeLog head   : 2004-09-06  Dalibor Topic),  I found a
case where an unexpected NullPointerException is thrown.
And I have found a possible bug in java.net.Socket.

Sun's API document says about java.net.Socket#getLocalAddress():

    Returns:
        the local address to which the socket is bound or
        InetAddress.anyLocalAddress() if the socket is not bound yet.

I am afraid InetAddress.anyLocalAddress() is not defined anywhere,
but I suppose it means anylocal or wildcard address.

So I fixed java/net/Socket.java and found Jetty worked without problem.

--- libraries/javalib/java/net/Socket.java.orig	Tue Jul 27 06:13:57 2004
+++ libraries/javalib/java/net/Socket.java	Tue Sep 14 16:04:32 2004
@@ -479,7 +479,8 @@
 
   /**
    * Returns the local address to which this socket is bound.  If this socket
-   * is not connected, then <code>null</code> is returned.
+   * is not connected, then <code>InetAddress.anyLocalAddress()</code> is
+   * returned.
    *
    * @return The local address
    *
@@ -487,22 +488,26 @@
    */
   public InetAddress getLocalAddress()
   {
-    if (! isBound())
-      return null;
-
     InetAddress addr = null;
 
-    try
+    if (! isBound())
       {
-	addr = (InetAddress) getImpl().getOption(SocketOptions.SO_BINDADDR);
+        addr = InetAddress.ANY_IF;
       }
-    catch (SocketException e)
+    else
       {
-	// (hopefully) shouldn't happen
-	// throw new java.lang.InternalError
-	//      ("Error in PlainSocketImpl.getOption");
-	return null;
-      }
+        try
+          {
+	    addr = (InetAddress) getImpl().getOption(SocketOptions.SO_BINDADDR);
+          }
+        catch (SocketException e)
+          {
+	    // (hopefully) shouldn't happen
+	    // throw new java.lang.InternalError
+	    //      ("Error in PlainSocketImpl.getOption");
+	    return null;
+          }
+    }
 
     // FIXME: According to libgcj, checkConnect() is supposed to be called
     // before performing this operation.  Problems: 1) We don't have the




More information about the kaffe mailing list