mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

abobrov
25.04.2008 64ad04811695411c23bc721c080719f5db355cf0
- complete fix for Issue 1231:
attempt to detect dual stack wildcard bind conflicts with dummy connect prior to the test bind.

3 files modified
45 ■■■■ changed files
opends/src/messages/messages/protocol.properties 4 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/protocols/jmx/JmxConnectionHandler.java 37 ●●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java 4 ●●●● patch | view | raw | blame | history
opends/src/messages/messages/protocol.properties
@@ -20,7 +20,7 @@
#
# CDDL HEADER END
#
#      Portions Copyright 2006-2007 Sun Microsystems, Inc.
#      Portions Copyright 2006-2008 Sun Microsystems, Inc.
@@ -1434,4 +1434,4 @@
 from %s to %s:  %s
SEVERE_ERR_LDIF_CONNHANDLER_CANNOT_DELETE_456=An error occurred while the \
 LDIF connection handler was attempting to delete processed file %s:  %s
SEVERE_ERR_LDAP_CONNHANDLER_ADDRESS_INUSE_457=Address already in use
SEVERE_ERR_CONNHANDLER_ADDRESS_INUSE_457=Address already in use
opends/src/server/org/opends/server/protocols/jmx/JmxConnectionHandler.java
@@ -22,9 +22,10 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.protocols.jmx;
import java.io.IOException;
import org.opends.messages.Message;
@@ -36,6 +37,7 @@
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
@@ -332,6 +334,39 @@
    ServerSocket s = null;
    try
    {
      // HACK:
      // With dual stacks we can have a situation when INADDR_ANY/PORT
      // is bound in TCP4 space but available in TCP6 space and since
      // JavaServerSocket implemantation will always use TCP46 on dual
      // stacks the bind below will always succeed in such cases thus
      // shadowing anything that is already bound to INADDR_ANY/PORT.
      // While technically correct, with IPv4 and IPv6 being separate
      // address spaces, it presents a problem to end users because a
      // common case scenario is to have a single service serving both
      // address spaces ie listening to the same port in both spaces
      // on wildcard addresses 0 and ::. ServerSocket implemantation
      // does not provide any means of working with each address space
      // separately such as doing TCP4 or TCP6 only binds thus we have
      // to do a dummy connect to INADDR_ANY/PORT to check if it is
      // bound to something already. This is only needed for wildcard
      // addresses as specific IPv4 or IPv6 addresses will always be
      // handled in their respective address space.
      Socket clientSocket = new Socket();
      try {
        // This might fail on some stacks but this is the best we
        // can do. No need for explicit timeout since it is local
        // address and we have to know for sure unless it fails.
        clientSocket.connect(new InetSocketAddress(
          config.getListenPort()));
      } catch (IOException e) {
        // Expected, ignore.
      }
      if (clientSocket.isConnected()) {
        clientSocket.close();
        throw new IOException(
          ERR_CONNHANDLER_ADDRESS_INUSE.get().toString());
      }
      s = new ServerSocket();
      s.setReuseAddress(true);
      s.bind(new InetSocketAddress(config.getListenPort()));
opends/src/server/org/opends/server/protocols/ldap/LDAPConnectionHandler.java
@@ -22,7 +22,7 @@
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2006-2007 Sun Microsystems, Inc.
 *      Portions Copyright 2006-2008 Sun Microsystems, Inc.
 */
package org.opends.server.protocols.ldap;
import org.opends.messages.Message;
@@ -744,7 +744,7 @@
            if (s.isConnected()) {
              s.close();
              throw new IOException(
                ERR_LDAP_CONNHANDLER_ADDRESS_INUSE.get().toString());
                ERR_CONNHANDLER_ADDRESS_INUSE.get().toString());
            }
          }