[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