Skip to content

fix: register channel before completing forwardLocal future to avoid dropping early CHANNEL_DATA#141

Merged
vicajilau merged 1 commit intoTerminalStudio:masterfrom
shihuili1218:master
Mar 19, 2026
Merged

fix: register channel before completing forwardLocal future to avoid dropping early CHANNEL_DATA#141
vicajilau merged 1 commit intoTerminalStudio:masterfrom
shihuili1218:master

Conversation

@shihuili1218
Copy link

Bug: When using forwardLocal() (direct-tcpip), if the remote server sends data (e.g. its SSH version string) immediately after the TCP connection is established, that data arrives as SSH_MSG_CHANNEL_DATA in the same TCP segment as SSH_MSG_CHANNEL_OPEN_CONFIRMATION. _handleChannelConfirmation completes the future via Completer.complete(), which schedules the async continuation as a microtask. Before that microtask runs, _handleChannelData processes the CHANNEL_DATA — but _channels[id] is still null at this point, so the data is silently dropped by ?.handleMessage().

Fix: Call _acceptChannel() synchronously inside _handleChannelConfirmation before completing the future, so the channel is registered in _channels immediately. _waitChannelOpen then simply returns the already-registered controller.

Impact: Fixes SSH connections through bastion hosts where the target server sends its version string immediately upon connection (which is standard behavior per RFC 4253).

@shihuili1218
Copy link
Author

Just a gentle ping on this PR — I really need this fix urgently, would appreciate a quick review when you get a chance. Thanks! @xtyxtyx @vicajilau

@vicajilau vicajilau merged commit 17ba902 into TerminalStudio:master Mar 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants