You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Sebb (Reopened) (JIRA)" <ji...@apache.org> on 2012/01/31 13:52:10 UTC
[jira] [Reopened] (NET-73) [net][PATCH] TelnetInputStream.read
hangs when socket data ends in a command sequence
[ https://issues.apache.org/jira/browse/NET-73?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Sebb reopened NET-73:
---------------------
The 2.x (and 3.x) line of code was patched in r633798, and I've checked that the same patch is also in the current 3.0.1 code.
==
I think the stack trace shows that the code is waiting to close a previous input stream as part of a connect.
This suggests that the problem may lie in the way the Telnet classes are being used.
Can you provide sample code that demonstrates the problem?
> [net][PATCH] TelnetInputStream.read hangs when socket data ends in a command sequence
> -------------------------------------------------------------------------------------
>
> Key: NET-73
> URL: https://issues.apache.org/jira/browse/NET-73
> Project: Commons Net
> Issue Type: Bug
> Environment: Operating System: other
> Platform: All
> Reporter: Rob Hasselbaum
> Attachments: cmd-seq-hang.patch
>
>
> Background: If one calls TelnetInputStream.read() in single-threaded mode (no
> reader thread) and there is no data immediately available, the call blocks on
> a socket read. When data starts to arrive, the stream adds all the available
> bytes to its internal queue before returning the first one to the caller. To
> do this, it calls __read() in a loop for as long as there are bytes available.
> The __read() method returns the first byte of "user data" from the socket. If
> __read() encounters a Telnet command sequence (IAC, WILL, WONT, DO, DONT,
> etc.), it handles the negotiation transparently and then returns the first
> byte of user data.
> In most cases, this works fine, but a problem arises if a chunk of data from
> the remote host ends in a Telnet command sequence. When that happens, the
> TelnetInputStream.read() method hangs, even though it may have already
> acquired some user data. This is because it calls __read() in a loop as long
> as super.available() returns true. But if the remaining data from the socket
> consists entirely of Telnet commands, __read() will process those AND THEN
> BLOCK waiting for user data.
> Just checking super.available() is not sufficient. We should continue the loop
> only if there are bytes of USER DATA still available from the socket. Not
> doing this can cause the client to wait indefinitely.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira