[ https://issues.apache.org/jira/browse/NET-73?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Sebb updated NET-73: -------------------- Affects Version/s: 1.4 Fix Version/s: 2.0 1.5 > [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 > Affects Versions: 1.4 > Environment: Operating System: other > Platform: All > Reporter: Rob Hasselbaum > Fix For: 1.5, 2.0 > > 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