Author: trustin
Date: Mon Dec  3 22:38:46 2007
New Revision: 600803

URL: http://svn.apache.org/viewvc?rev=600803&view=rev
Log:
Fixed issue: DIRMINA-435 (NullPointerException in IoServiceListenerSupport)
* MINA was not handling the case that SocketChannel.finishConnect() returns 
false.  Made sure the selection key is not cancelled if finishConnect() returns 
false.


Modified:
    
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
    
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
    
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoConnector.java
    
mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramConnector.java
    
mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketConnector.java
    
mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprSocketConnector.java

Modified: 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java?rev=600803&r1=600802&r2=600803&view=diff
==============================================================================
--- 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
 (original)
+++ 
mina/branches/1.0/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
 Mon Dec  3 22:38:46 2007
@@ -38,9 +38,10 @@
 import org.apache.mina.common.support.AbstractIoFilterChain;
 import org.apache.mina.common.support.BaseIoConnector;
 import org.apache.mina.common.support.DefaultConnectFuture;
-import org.apache.mina.util.Queue;
-import org.apache.mina.util.NewThreadExecutor;
 import org.apache.mina.util.NamePreservingRunnable;
+import org.apache.mina.util.NewThreadExecutor;
+import org.apache.mina.util.Queue;
+
 import edu.emory.mathcs.backport.java.util.concurrent.Executor;
 
 /**
@@ -292,14 +293,16 @@
 
             boolean success = false;
             try {
-                ch.finishConnect();
-                newSession(ch, entry.handler, entry.config, entry);
+                if (ch.finishConnect()) {
+                    key.cancel();
+                    newSession(ch, entry.handler, entry.config, entry);
+                }
                 success = true;
             } catch (Throwable e) {
                 entry.setException(e);
             } finally {
-                key.cancel();
                 if (!success) {
+                    key.cancel();
                     try {
                         ch.close();
                     } catch (IOException e) {

Modified: 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java?rev=600803&r1=600802&r2=600803&view=diff
==============================================================================
--- 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
 (original)
+++ 
mina/branches/1.1/core/src/main/java/org/apache/mina/transport/socket/nio/SocketConnector.java
 Mon Dec  3 22:38:46 2007
@@ -272,14 +272,16 @@
 
             boolean success = false;
             try {
-                ch.finishConnect();
-                newSession(ch, entry.handler, entry.config, entry);
+                if (ch.finishConnect()) {
+                    key.cancel();
+                    newSession(ch, entry.handler, entry.config, entry);
+                }
                 success = true;
             } catch (Throwable e) {
                 entry.setException(e);
             } finally {
-                key.cancel();
                 if (!success) {
+                    key.cancel();
                     try {
                         ch.close();
                     } catch (IOException e) {

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoConnector.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoConnector.java?rev=600803&r1=600802&r2=600803&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoConnector.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/common/AbstractPollingIoConnector.java
 Mon Dec  3 22:38:46 2007
@@ -115,7 +115,7 @@
     protected abstract void destroy() throws Exception;
     protected abstract H newHandle(SocketAddress localAddress) throws 
Exception;
     protected abstract boolean connect(H handle, SocketAddress remoteAddress) 
throws Exception;
-    protected abstract void finishConnect(H handle) throws Exception;
+    protected abstract boolean finishConnect(H handle) throws Exception;
     protected abstract T newSession(IoProcessor<T> processor, H handle) throws 
Exception;
     protected abstract void close(H handle) throws Exception;
     protected abstract void wakeup();
@@ -241,12 +241,13 @@
             ConnectionRequest entry = connectionRequest(handle);
             boolean success = false;
             try {
-                finishConnect(handle);
-                T session = newSession(processor, handle);
-                finishSessionInitialization(session, entry);
-                // Forward the remaining process to the IoProcessor.
-                session.getProcessor().add(session);
-                nHandles ++;
+                if (finishConnect(handle)) {
+                    T session = newSession(processor, handle);
+                    finishSessionInitialization(session, entry);
+                    // Forward the remaining process to the IoProcessor.
+                    session.getProcessor().add(session);
+                    nHandles ++;
+                }
                 success = true;
             } catch (Throwable e) {
                 entry.setException(e);

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramConnector.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramConnector.java?rev=600803&r1=600802&r2=600803&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramConnector.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioDatagramConnector.java
 Mon Dec  3 22:38:46 2007
@@ -137,7 +137,7 @@
     }
 
     @Override
-    protected void finishConnect(DatagramChannel handle) throws Exception {
+    protected boolean finishConnect(DatagramChannel handle) throws Exception {
         throw new UnsupportedOperationException();
     }
 

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketConnector.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketConnector.java?rev=600803&r1=600802&r2=600803&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketConnector.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/transport/socket/nio/NioSocketConnector.java
 Mon Dec  3 22:38:46 2007
@@ -125,13 +125,16 @@
     }
 
     @Override
-    protected void finishConnect(SocketChannel handle) throws Exception {
+    protected boolean finishConnect(SocketChannel handle) throws Exception {
         SelectionKey key = handle.keyFor(selector);
-        if (key != null) {
-            key.cancel();
+        if (handle.finishConnect()) {
+            if (key != null) {
+                key.cancel();
+            }
+            return true;
         }
         
-        handle.finishConnect();
+        return false;
     }
 
     @Override

Modified: 
mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprSocketConnector.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprSocketConnector.java?rev=600803&r1=600802&r2=600803&view=diff
==============================================================================
--- 
mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprSocketConnector.java
 (original)
+++ 
mina/trunk/transport-apr/src/main/java/org/apache/mina/transport/socket/apr/AprSocketConnector.java
 Mon Dec  3 22:38:46 2007
@@ -176,13 +176,14 @@
     }
 
     @Override
-    protected void finishConnect(Long handle) throws Exception {
+    protected boolean finishConnect(Long handle) throws Exception {
         Poll.remove(pollset, handle);
         requests.remove(handle);
         if (failedHandles.remove(handle)) {
             int rv = Socket.recvb(handle, dummyBuffer, 0, 1);
             throwException(rv);
         }
+        return true;
     }
 
     @Override


Reply via email to