[ 
https://issues.apache.org/jira/browse/SSHD-785?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Work on SSHD-785 started by Goldstein Lyor.
-------------------------------------------
> ChannelPipedInputStream attempts to read from client even for 0-byte reads.
> ---------------------------------------------------------------------------
>
>                 Key: SSHD-785
>                 URL: https://issues.apache.org/jira/browse/SSHD-785
>             Project: MINA SSHD
>          Issue Type: Bug
>    Affects Versions: 1.6.0
>            Reporter: Antti S. Lankila
>            Assignee: Goldstein Lyor
>            Priority: Minor
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> I ran into interoperability issue between my own implementation of SFTP 
> protocol (don't even ask) and JSch. The interaction between the client and 
> server hangs on JSch attempting to issue REALPATH command for the empty 
> string. This is method called getHome(), and it is used to handle resolving 
> relative paths on the client side. The specifics why it does this are not 
> important; the bug I ran into affects the situations where any ssh command 
> packet contains the empty string.
> Using the REALPATH "" as example, the data for this command is just 4 zero 
> bytes (length of string as 32-bit integer), and no string data.
> My code attempted to create the 0-byte string based on the length value, and 
> basically executed this:
>     byte[] buffer = new byte[0];
>     in.read(buffer);
> The javadocs for InputStream says that if the length fo the passed byte[] 
> buffer is 0, then the implementation just returns 0 and doesn't attempt to 
> read anything. Unfortunately, ChannelPipedInputStream has its own 
> implementation of read(byte[], int, int), and seems to attempt to read 
> something from client before not actually using the data and returning 0. 
> Client and server deadlock here: client waits for server reply, server waits 
> for more data from client. Eventually, JSch timeouts, and closes the 
> connection. What happens is that this 0 byte read then succeeds, server 
> attempts to write back the FX_NAME response, but client has already closed 
> connection, and the server gets an exception. In my case, this takes about 8 
> minutes to happen, which corresponds to some default timeout in JSch.
> The fix would be to detect the attempt to read 0 bytes in 
> ChannelPipedInputStream and just return early, similar to how 
> java.io.InputStream does read(byte[], int, int). This bug should be fixed 
> because this would align CPIS's implementation with the documentation and 
> general behavior of java's InputStreams.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to