You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "Ivan Fiorentini (Jira)" <ji...@apache.org> on 2022/08/10 11:54:00 UTC

[jira] [Comment Edited] (SSHD-1288) Infinite loop in org.apache.sshd.sftp.client.impl.SftpInputStreamAsync#doRead

    [ https://issues.apache.org/jira/browse/SSHD-1288?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17577782#comment-17577782 ] 

Ivan Fiorentini edited comment on SSHD-1288 at 8/10/22 11:53 AM:
-----------------------------------------------------------------

{quote}*Fixing this is not hard, nor is writing a test case for it.*
{quote}
That is a very good news, thanks a lot Thomas !

About the planning for the release containing the fix we wait the decision of the release manager as you said.

In the meantime, if the the fix could be implemented and commited to github that would be great ! :  I should be able
to patch the version (2.8.0) in use in our application and solve the issue the users are experiencing and postpone the application of the official "MINA SSHD" release containing the fix  when it is ready.
Do you think it is possible to proceed in this manner ?


was (Author: JIRAUSER294011):
{quote}*Fixing this is not hard, nor is writing a test case for it.*
{quote}
That is a very good news, thanks a lot Thomas !

About the planning for the release containing the fix we wait the decision of the release manager as you said.

In the meantime, if the the fix could be implemented and commited to github that would be great ! :  I' should be able
to patch the version (2.8.0) in use in our application and solve the issue the users are experiencing and postpone the application of the official "MINA SSHD" release containing the fix  when it is ready.
Do you think it is possible to proceed in this manner ?

> Infinite loop in org.apache.sshd.sftp.client.impl.SftpInputStreamAsync#doRead
> -----------------------------------------------------------------------------
>
>                 Key: SSHD-1288
>                 URL: https://issues.apache.org/jira/browse/SSHD-1288
>             Project: MINA SSHD
>          Issue Type: Bug
>    Affects Versions: 2.8.0
>            Reporter: Ivan Fiorentini
>            Assignee: Thomas Wolf
>            Priority: Major
>         Attachments: image-2022-08-05-17-08-55-698.png
>
>
> I reported an  infinite loop  in org.apache.sshd.sftp.client.impl.SftpInputStreamAsync#doRead:
> and after the production of a thread and system dump the  point in execution was:
> {code:java}
> private long doRead(long max, BufferConsumer consumer) throws IOException {
>     long orgOffset = clientOffset;
>     while (max > 0) {
>         if (hasNoData()) {
>             if (eofIndicator) {
>                 break;
>             }
>             if (!pendingReads.isEmpty()) {
>                 fillData();
>             }
>             if (!eofIndicator) {
>                 sendRequests(); <- (do not send any request ! it does nothing !)
>             }
>         } else {
>             int nb = (int) Math.min(max, buffer.available());
>             consumer.consume(new ByteArrayBuffer(buffer.array(), buffer.rpos(), nb));
>             buffer.rpos(buffer.rpos() + nb);
>             clientOffset += nb;
>             max -= nb;
>         }
>     }
>     return clientOffset - orgOffset;
> }
> {code}
>  
> In the system dump it seems the size of file to receive  is obtained before to start the transfer... this size is 82.132.992 bytes; but during the receipt of the data it seems (at the time of the dump) that 82.156.760 was successfully received... *_this could happen if , during the file receipt, at the remote site the file is written (expanded) with more data._*
> ... but when the size of the received data is greater than the original it seems an infinite loop could happen in the org.apache.sshd.sftp.client.impl.SftpInputStreamAsync#doRead when the sendRequests() is invoked to obtain more data (or receive the end of file);
> In the sendRequest():
> {code:java}
> while (pendingReads.size() < Math.max(1, windowSize / bufferSize)
>        && (fileSize <= 0 || requestOffset < fileSize + bufferSize)) {
>        
>        ... do the send request to obtain more data (or to receive the end of file)      
>         requestOffset += bufferSize;
>         }
> {code}
>  ... the condition *requestOffset < fileSize + bufferSize* 
> is not satisfied if the *requestOffset* >= *fileSize + bufferSize*
> preventing the code from sending a request to receive more data (and/or obtain the end of file) and causing the infinite loop.
> The values of the above variables at time of the dump was:
> !image-2022-08-05-17-08-55-698.png!
> ... so that "{*}(fileSize <= 0 || requestOffset < fileSize + bufferSize)"{*} is {color:#de350b}*FALSE*{color}
> To reproduce the problem:
>  # create the remote file to receive (1Mb size)
>  # create SftpClient sftp = DefaultSftpClientFactory.NSTANCE.createSftpClient(clientSession)
>  # create InputStream is = sftp.read(file, 32768) end read the inputstrem 4kb at time
>  # stop at the end of while loop block in org.apache.sshd.sftp.client.impl.SftpInputStreamAsync#sendRequests
> when the requestOffset > fileSize
>  # expand the remote file size to 2Mb
>  # remove the stop at point 4 and continue
>  # {color:#ffbdad}the code enter into an infinite loop{color}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@mina.apache.org
For additional commands, e-mail: dev-help@mina.apache.org