[prev in list] [next in list] [prev in thread] [next in thread] 

List:       mina-dev
Subject:    [jira] [Work logged] (SSHD-1288) Infinite loop in org.apache.sshd.sftp.client.impl.SftpInputStreamAs
From:       "ASF GitHub Bot (Jira)" <jira () apache ! org>
Date:       2022-08-13 10:05:00
Message-ID: JIRA.13475463.1659712178000.156868.1660385100020 () Atlassian ! JIRA
[Download RAW message or body]


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

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

                Author: ASF GitHub Bot
            Created on: 13/Aug/22 10:04
            Start Date: 13/Aug/22 10:04
    Worklog Time Spent: 10m 
      Work Description: tomaswolf merged PR #239:
URL: https://github.com/apache/mina-sshd/pull/239




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

    Worklog Id:     (was: 800417)
    Time Spent: 20m  (was: 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: 20m
> 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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic