You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Thomas Wolf (Jira)" <ji...@apache.org> on 2022/05/02 23:08:00 UTC

[jira] [Commented] (SSHD-1262) Unhandled SSH_MSG_CHANNEL_WINDOW_ADJUST leeds to SocketTimeoutException

    [ https://issues.apache.org/jira/browse/SSHD-1262?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17530965#comment-17530965 ] 

Thomas Wolf commented on SSHD-1262:
-----------------------------------

I've only looked at local port forwarding and the Nio2 implementation so far.

It seems to me the problem in local port forwarding is that we bind an Nio2IoAcceptor on the local port, which creates an Nio2Session and calls session.startReading() right away. So we read data from the local port before we even sent the SSH_MSG_CHANNEL_OPEN, and before we get the SSH_MSG_CHANNEL_OPEN_CONFIRMATION (or FAILURE). That's why we buffer data read on the socket and then try to write it once we do have the open confirmation.

Perhaps the message handler ({{StaticIoHandler.messageReceived()}}) should suspend reads on the Nio2Session when there's not enough window space, and reading should be resumed only once the window has been enlarged again. Initially reading should be suspended, and be resumed only once the open confirmation has been received. Then one might not need a queue, one could be sure that there'd be no pending data when the confirmation comes in, and that no further data accumulates through the local socket when the window size is exhausted.

I'd have to look at how this is implemented with MINA and Netty, and what exactly happens in remote port forwarding and in dynamic port forwarding to see if that might be a viable avenue to avoid the problem here without re-introducing SSHD-849 or other past problems.

> Unhandled SSH_MSG_CHANNEL_WINDOW_ADJUST leeds to SocketTimeoutException
> -----------------------------------------------------------------------
>
>                 Key: SSHD-1262
>                 URL: https://issues.apache.org/jira/browse/SSHD-1262
>             Project: MINA SSHD
>          Issue Type: Bug
>    Affects Versions: 2.7.0, 2.8.0
>            Reporter: Stefan Maute
>            Priority: Major
>              Labels: mina, sshd
>         Attachments: failing-pf-trace-logs.txt
>
>
> Wanted to open a local port forwarding to an SSH server and afterwards connect to MQTT server over the SSh tunnel. During the MQTT connection attempt I encountered a SocketTimeoutException in the logs (StackTrace below).
> What I could see in the logs is that the server is sending an initial window size of 0 and afterwards the _waitForCondition_ method is throwing the SocketTimeoutException .
> After analyzing the logs I maybe have an idea what is going on here. My assumption is that  there is some deadlock in case the initial window size is 0 and the SSH_MSG_CHANNEL_WINDOW_ADJUST  isn't handled properly. 
> I have attached the whole log file. Lines of interest are from 169 to 229.
> Tested with 2.7.0 and 2.8.0.
>  
> {code:java}
> WARN org.apache.sshd.common.forward.DefaultForwarder - exceptionCaught(Nio2Session[local=/127.0.0.1:44259, remote=/127.0.0.1:60188]) SocketTimeoutException: waitForCondition(Window[client/remote](TcpipClientChannel[id=0, recipient=0]-ClientSessionImpl[Admin@/x.xxx.xx.x:xxxx])) timeout exceeded: PT30S java.net.SocketTimeoutException: waitForCondition(Window[client/remote](TcpipClientChannel[id=0, recipient=0]-ClientSessionImpl[Admin@/x.xxx.xx.x:xxxx])) timeout exceeded: PT30S     at org.apache.sshd.common.channel.Window.waitForCondition(Window.java:332)     at org.apache.sshd.common.channel.Window.waitForSpace(Window.java:286)     at org.apache.sshd.common.channel.ChannelOutputStream.write(ChannelOutputStream.java:154)     at org.apache.sshd.client.channel.ClientChannelPendingMessagesQueue.writeMessage(ClientChannelPendingMessagesQueue.java:174)     at org.apache.sshd.client.channel.ClientChannelPendingMessagesQueue.flushPendingQueue(ClientChannelPendingMessagesQueue.java:221)     at org.apache.sshd.client.channel.ClientChannelPendingMessagesQueue.operationComplete(ClientChannelPendingMessagesQueue.java:206)     at org.apache.sshd.client.channel.ClientChannelPendingMessagesQueue.operationComplete(ClientChannelPendingMessagesQueue.java:51)     at org.apache.sshd.common.future.AbstractSshFuture.notifyListener(AbstractSshFuture.java:159)     at org.apache.sshd.common.future.DefaultSshFuture.notifyListeners(DefaultSshFuture.java:215)     at org.apache.sshd.common.future.DefaultSshFuture.setValue(DefaultSshFuture.java:112)     at org.apache.sshd.client.future.DefaultOpenFuture.setOpened(DefaultOpenFuture.java:68)     at org.apache.sshd.client.channel.AbstractClientChannel.handleOpenSuccess(AbstractClientChannel.java:360)     at org.apache.sshd.common.session.helpers.AbstractConnectionService.channelOpenConfirmation(AbstractConnectionService.java:545)     at org.apache.sshd.common.session.helpers.AbstractConnectionService.process(AbstractConnectionService.java:456)     at org.apache.sshd.common.session.helpers.AbstractSession.doHandleMessage(AbstractSession.java:503)     at org.apache.sshd.common.session.helpers.AbstractSession.handleMessage(AbstractSession.java:429)     at org.apache.sshd.common.session.helpers.AbstractSession.decode(AbstractSession.java:1466)     at org.apache.sshd.common.session.helpers.AbstractSession.messageReceived(AbstractSession.java:389)     at org.apache.sshd.common.session.helpers.AbstractSessionIoHandler.messageReceived(AbstractSessionIoHandler.java:64)     at org.apache.sshd.common.io.nio2.Nio2Session.handleReadCycleCompletion(Nio2Session.java:359)     at org.apache.sshd.common.io.nio2.Nio2Session$1.onCompleted(Nio2Session.java:336)     at org.apache.sshd.common.io.nio2.Nio2Session$1.onCompleted(Nio2Session.java:333)     at org.apache.sshd.common.io.nio2.Nio2CompletionHandler.lambda$completed$0(Nio2CompletionHandler.java:38)     at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)     at org.apache.sshd.common.io.nio2.Nio2CompletionHandler.completed(Nio2CompletionHandler.java:37)     at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:129)     at java.base/sun.nio.ch.Invoker$2.run(Invoker.java:221)     at java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:113)     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)     at java.base/java.lang.Thread.run(Thread.java:833) {code}
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

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