[
https://issues.apache.org/jira/browse/NET-466?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13285341#comment-13285341
]
Gary D. Gregory commented on NET-466:
-------------------------------------
Are you saying that all methods in {{BufferedInputStream}} marked with
{{synchronized}} should also be marked as such in {{TelnetInputStream}}?
This in TelnetClient is confusing:
{code:java}
protected void _connectAction_() throws IOException
{
super._connectAction_();
TelnetInputStream tmp = new TelnetInputStream(_input_, this,
readerThread);
if(readerThread)
{
tmp._start();
}
// __input CANNOT refer to the TelnetInputStream. We run into
// blocking problems when some classes use TelnetInputStream, so
// we wrap it with a BufferedInputStream which we know is safe.
// This blocking behavior requires further investigation, but right
// now it looks like classes like InputStreamReader are not implemented
// in a safe manner.
__input = new BufferedInputStream(tmp);
__output = new TelnetOutputStream(this);
}
{code}
{{TelnetInputStream}} subclasses {{BufferedInputStream}} and this method wraps
the {{TelnetInputStream}} in a {{BufferedInputStream}}. Is that what is
intended here? If so, it needs better docs!
> Regression: TelnetInputStream#available() blocks
> ------------------------------------------------
>
> Key: NET-466
> URL: https://issues.apache.org/jira/browse/NET-466
> Project: Commons Net
> Issue Type: Bug
> Components: Telnet
> Affects Versions: 3.1
> Reporter: Martin Oberhuber
> Priority: Critical
> Fix For: 3.1
>
>
> When testing with Commons Net 3.1 for Eclipse
> https://bugs.eclipse.org/bugs/show_bug.cgi?id=194473 , I found that our
> telnet client blocks when the ReaderThread is running and waiting for new
> data. Investigation shows that our code blocks on
> TelnetInputStream#available().
> This regression is due to the code introduced for NET-437 "TelnetInputStream
> doesn't support non-blocking IO when reader thread is not enabled":
> TelnetInputStream#available() now calls super.available() which is declared
> as "synchronized" on BufferedInputStream in JDK 1.6.0_21 at least. But at the
> same time, the telnet ReaderThread has already the Monitor on
> BufferedInputStream and doesn't give it up while sitting in read0().
> This seems to be exactly the situation that the comment before
> TelnetInputStream#close() warns about:
> // Cannot be synchronized. Will cause deadlock if run() is blocked
> // in read because BufferedInputStream read() is synchronized.
> This is a severe issue since it violates the specification and use of
> available().
--
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