You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "ASF GitHub Bot (Jira)" <ji...@apache.org> on 2022/08/12 20:59:00 UTC

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

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

ASF GitHub Bot logged work on SSHD-1288:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 12/Aug/22 20:58
            Start Date: 12/Aug/22 20:58
    Worklog Time Spent: 10m 
      Work Description: tomaswolf opened a new pull request, #239:
URL: https://github.com/apache/mina-sshd/pull/239

   If data is appended while a file is read via SFTP, SftpInputStreamAsync
   would enter an infinite loop if requestOffset >= fileSize + bufferSize.
   Fix this and issue only sequential read requests once we detect that
   we're beyond the expected EOF.




Issue Time Tracking
-------------------

            Worklog Id:     (was: 800380)
    Remaining Estimate: 0h
            Time Spent: 10m

> 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
>
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> 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