Author: markt
Date: Tue Aug 16 10:17:33 2011
New Revision: 1158183
URL: http://svn.apache.org/viewvc?rev=1158183&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51515
Prevent immediate socket close when comet is used over HTTPS
Modified:
tomcat/tc6.0.x/trunk/STATUS.txt
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java
tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=1158183&r1=1158182&r2=1158183&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Tue Aug 16 10:17:33 2011
@@ -96,10 +96,3 @@ PATCHES PROPOSED TO BACKPORT:
I wonder whether ConcurrentHashMap.DEFAULT_CONCURRENCY_LEVEL which is
16 is enough.
- getStuckThreadIds() returns a list of ids. It might be useful to
have a similar method that returns Thread.getName() names.
-
-* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51515
- Prevent immediate socket close when comet is used over HTTPS
- http://people.apache.org/~markt/patches/2011-07-22-bug51515-tc6.patch
- (note: The only change to NioEndpoint is adding a sync)
- +1: markt, jfclere, kkolinko
- -1:
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java?rev=1158183&r1=1158182&r2=1158183&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11NioProtocol.java
Tue Aug 16 10:17:33 2011
@@ -746,13 +746,7 @@ public class Http11NioProtocol implement
// In the middle of processing a request/response. Keep the
// socket associated with the processor.
connections.put(socket, processor);
-
- if (processor.comet) {
- NioEndpoint.KeyAttachment att =
(NioEndpoint.KeyAttachment)socket.getAttachment(false);
- socket.getPoller().add(socket,att.getCometOps());
- } else {
- socket.getPoller().add(socket);
- }
+ socket.getPoller().add(socket);
} else if (state == SocketState.OPEN) {
// In keep-alive but between requests. OK to recycle
// processor. Continue to poll for the next request.
Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=1158183&r1=1158182&r2=1158183&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Tue
Aug 16 10:17:33 2011
@@ -2251,83 +2251,85 @@ public class NioEndpoint {
}
public void run() {
- NioEndpoint.this.activeSocketProcessors.addAndGet(1);
- SelectionKey key = null;
- try {
- key =
socket.getIOChannel().keyFor(socket.getPoller().getSelector());
- int handshake = -1;
-
+ synchronized (socket) {
+ NioEndpoint.this.activeSocketProcessors.addAndGet(1);
+ SelectionKey key = null;
try {
- if (key!=null) handshake =
socket.handshake(key.isReadable(), key.isWritable());
- }catch ( IOException x ) {
- handshake = -1;
- if ( log.isDebugEnabled() ) log.debug("Error during SSL
handshake",x);
- }catch ( CancelledKeyException ckx ) {
- handshake = -1;
- }
- if ( handshake == 0 ) {
- // Process the request from this socket
- boolean closed =
(status==null)?(handler.process(socket)==Handler.SocketState.CLOSED) :
-
(handler.event(socket,status)==Handler.SocketState.CLOSED);
-
- if (closed) {
- // Close socket and pool
- try {
- KeyAttachment ka = null;
- if (key!=null) {
- ka = (KeyAttachment) key.attachment();
- if (ka!=null) ka.setComet(false);
- socket.getPoller().cancelledKey(key,
SocketStatus.ERROR, false);
+ key =
socket.getIOChannel().keyFor(socket.getPoller().getSelector());
+ int handshake = -1;
+
+ try {
+ if (key!=null) handshake =
socket.handshake(key.isReadable(), key.isWritable());
+ }catch ( IOException x ) {
+ handshake = -1;
+ if ( log.isDebugEnabled() ) log.debug("Error during
SSL handshake",x);
+ }catch ( CancelledKeyException ckx ) {
+ handshake = -1;
+ }
+ if ( handshake == 0 ) {
+ // Process the request from this socket
+ boolean closed =
(status==null)?(handler.process(socket)==Handler.SocketState.CLOSED) :
+
(handler.event(socket,status)==Handler.SocketState.CLOSED);
+
+ if (closed) {
+ // Close socket and pool
+ try {
+ KeyAttachment ka = null;
+ if (key!=null) {
+ ka = (KeyAttachment) key.attachment();
+ if (ka!=null) ka.setComet(false);
+ socket.getPoller().cancelledKey(key,
SocketStatus.ERROR, false);
+ }
+ if (socket!=null) nioChannels.offer(socket);
+ socket = null;
+ if ( ka!=null ) keyCache.offer(ka);
+ ka = null;
+ }catch ( Exception x ) {
+ log.error("",x);
}
- if (socket!=null) nioChannels.offer(socket);
- socket = null;
- if ( ka!=null ) keyCache.offer(ka);
- ka = null;
- }catch ( Exception x ) {
- log.error("",x);
+ }
+ } else if (handshake == -1 ) {
+ KeyAttachment ka = null;
+ if (key!=null) {
+ ka = (KeyAttachment) key.attachment();
+ socket.getPoller().cancelledKey(key,
SocketStatus.DISCONNECT, false);
}
- }
- } else if (handshake == -1 ) {
- KeyAttachment ka = null;
- if (key!=null) {
- ka = (KeyAttachment) key.attachment();
- socket.getPoller().cancelledKey(key,
SocketStatus.DISCONNECT, false);
+ if (socket!=null) nioChannels.offer(socket);
+ socket = null;
+ if ( ka!=null ) keyCache.offer(ka);
+ ka = null;
+ } else {
+ final SelectionKey fk = key;
+ final int intops = handshake;
+ final KeyAttachment ka =
(KeyAttachment)fk.attachment();
+ ka.getPoller().add(socket,intops);
}
- if (socket!=null) nioChannels.offer(socket);
- socket = null;
- if ( ka!=null ) keyCache.offer(ka);
- ka = null;
- } else {
- final SelectionKey fk = key;
- final int intops = handshake;
- final KeyAttachment ka = (KeyAttachment)fk.attachment();
- ka.getPoller().add(socket,intops);
- }
- }catch(CancelledKeyException cx) {
- socket.getPoller().cancelledKey(key,null,false);
- } catch (OutOfMemoryError oom) {
- try {
- oomParachuteData = null;
-
socket.getPoller().cancelledKey(key,SocketStatus.ERROR,false);
- releaseCaches();
- log.error("", oom);
- }catch ( Throwable oomt ) {
+ }catch(CancelledKeyException cx) {
+ socket.getPoller().cancelledKey(key,null,false);
+ } catch (OutOfMemoryError oom) {
try {
- System.err.println(oomParachuteMsg);
- oomt.printStackTrace();
- }catch (Throwable letsHopeWeDontGetHere){}
+ oomParachuteData = null;
+
socket.getPoller().cancelledKey(key,SocketStatus.ERROR,false);
+ releaseCaches();
+ log.error("", oom);
+ }catch ( Throwable oomt ) {
+ try {
+ System.err.println(oomParachuteMsg);
+ oomt.printStackTrace();
+ }catch (Throwable letsHopeWeDontGetHere){}
+ }
+ }catch ( Throwable t ) {
+ log.error("",t);
+
socket.getPoller().cancelledKey(key,SocketStatus.ERROR,false);
+ } finally {
+ socket = null;
+ status = null;
+ //return to cache
+ processorCache.offer(this);
+ NioEndpoint.this.activeSocketProcessors.addAndGet(-1);
}
- }catch ( Throwable t ) {
- log.error("",t);
- socket.getPoller().cancelledKey(key,SocketStatus.ERROR,false);
- } finally {
- socket = null;
- status = null;
- //return to cache
- processorCache.offer(this);
- NioEndpoint.this.activeSocketProcessors.addAndGet(-1);
}
+ }
}
-
}
// ---------------------------------------------- TaskQueue Inner Class
Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=1158183&r1=1158182&r2=1158183&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Tue Aug 16 10:17:33 2011
@@ -230,6 +230,10 @@
Prevent NPEs when a socket is closed in non-error conditions after
sendfile processing when using the HTTP NIO connector. (markt)
</fix>
+ <fix>
+ <bug>51515</bug>: Prevent immediate socket close when comet is used
over
+ HTTPS. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Jasper">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]