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/05 15:10:00 UTC
[jira] [Created] (SSHD-1288) Infinite loop in org.apache.sshd.sftp.client.impl.SftpInputStreamAsync#doRead
Ivan Fiorentini created SSHD-1288:
-------------------------------------
Summary: 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
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