tomaswolf opened a new pull request, #257:
URL: https://github.com/apache/mina-sshd/pull/257

   Nio2Session.shutdownOutputStream() can be invoked while there are still 
writes in progress. The output is shut down in TCP/IP port forwarding to 
propagate an SSH_MSG_CHANNEL_EOF from the channel to whatever is on the other 
side of the forwarded port; see SSHD-1055. However, writing through the socket 
is asynchronous, so a channel may get the following sequence of events:
   
   1. receive last SSH_MSG_CHANNEL_DATA
   2. Nio2Session.writeBuffer() enqueues the write request
   3. SSH_MSG_CHANNEL_DATA handling completes
   4. receive SSH_MSG_CHANNEL_EOF
   5. call Nio2Session.shutdownOutputStream()
   
   If (5) shuts down the output immediately but the write request from (2) has 
not been written yet, that write attempt will fail with a 
ClosedChannelException.
   
   The output stream on the socket should not be shut down immediately but only 
once already pending writes have been done. This is already the case with the 
MINA and Netty transport back-ends, which only schedule a shutdown request on 
their write queue.
   
   Implement the same for the NIO2 transport. A write future with a null buffer 
signifies a shutdown request; true write requests always have a non-null 
buffer. Make shutdownOutputStream() only enqueue such a shutdown request on the 
session's write queue; the output will be shut down once startWriting() pops 
this shutdown request from the write queue.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscr...@mina.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@mina.apache.org
For additional commands, e-mail: dev-h...@mina.apache.org

Reply via email to