[
https://issues.apache.org/jira/browse/SSHD-921?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16863840#comment-16863840
]
Zhenliang Su edited comment on SSHD-921 at 6/14/19 8:45 AM:
------------------------------------------------------------
I think a simple modification is to change theĀ
org.apache.sshd.agent.local.AgentForwardedChannel#request function:
{code:java}
protected Buffer request(Buffer buffer) throws IOException {
synchronized (messages) {
try {
OutputStream outputStream = getInvertedIn();
outputStream.write(buffer.array(), buffer.rpos(),
buffer.available());
outputStream.flush();
Window wLocal = getLocalWindow();
wLocal.consumeAndCheck(buffer.available());
if (messages.isEmpty()) {
long start = System.currentTimeMillis();
long authTimeout =
getLongProperty(FactoryManager.AUTH_TIMEOUT,
FactoryManager.DEFAULT_AUTH_TIMEOUT);
messages.wait(authTimeout + 2000); // The 2000 here is just
for a little longer.
long end = System.currentTimeMillis();
if (end - start > authTimeout) {
throw new IOException("wait timeout");
}
}
return messages.poll();
} catch (InterruptedException e) {
throw (IOException) new InterruptedIOException("Interrupted
while polling for messages").initCause(e);
}
}
}
{code}
was (Author: smoking):
I think a simple modification is to chang theĀ
org.apache.sshd.agent.local.AgentForwardedChannel#request function:
{code:java}
protected Buffer request(Buffer buffer) throws IOException {
synchronized (messages) {
try {
OutputStream outputStream = getInvertedIn();
outputStream.write(buffer.array(), buffer.rpos(),
buffer.available());
outputStream.flush();
Window wLocal = getLocalWindow();
wLocal.consumeAndCheck(buffer.available());
if (messages.isEmpty()) {
long start = System.currentTimeMillis();
long authTimeout =
getLongProperty(FactoryManager.AUTH_TIMEOUT,
FactoryManager.DEFAULT_AUTH_TIMEOUT);
messages.wait(authTimeout + 2000); // The 2000 here is just
for a little longer.
long end = System.currentTimeMillis();
if (end - start > authTimeout) {
throw new IOException("wait timeout");
}
}
return messages.poll();
} catch (InterruptedException e) {
throw (IOException) new InterruptedIOException("Interrupted
while polling for messages").initCause(e);
}
}
}
{code}
> OutOfMemory Error in extreme situations
> ---------------------------------------
>
> Key: SSHD-921
> URL: https://issues.apache.org/jira/browse/SSHD-921
> Project: MINA SSHD
> Issue Type: Bug
> Affects Versions: 1.7.0, 2.0.0
> Reporter: Zhenliang Su
> Assignee: Goldstein Lyor
> Priority: Major
> Attachments: Main.java, jstack.txt
>
>
> The demo code run in my local machine.
> When I 'ssh [email protected] -p 2233', my demo will use the agent forwarding
> feature to login 10.10.16.201.
> In most cases, it's ok. But in few cases, for example, client disconnect
> suddenly, it will lead to OutOfMemory Error.
> To simulate this scenario of OutOfMemory Error, I did some trick to the sshd
> code:
> 1. In org.apache.sshd.common.future.DefaultSshFuture#setValue:
> {code:java}
> public void setValue(Object newValue) {
> // to simulate race condition
> try {
> Thread.sleep(10);
> } catch (Exception e) {
> // ignore
> }
> synchronized (lock) {
> // Allow only once.
> if (result != null) {
> return;
> }
> result = (newValue != null) ? newValue : GenericUtils.NULL;
> lock.notifyAll();
> }
> notifyListeners();
> }
> {code}
> 2. In org.apache.sshd.agent.local.AgentForwardedChannel#doWriteData:
> {code:java}
> protected void doWriteData(byte[] data, int off, long len) throws
> IOException {
> ValidateUtils.checkTrue(len <= Integer.MAX_VALUE, "Data length
> exceeds int boundaries: %d", len);
> Buffer message = null;
> synchronized (receiveBuffer) {
> receiveBuffer.putBuffer(new ByteArrayBuffer(data, off, (int)
> len));
> // to simulate client disconnect suddenly
> if (false && receiveBuffer.available() >= 4) {
> off = receiveBuffer.rpos();
> len = receiveBuffer.getInt();
> receiveBuffer.rpos(off);
> if (receiveBuffer.available() >= (4 + len)) {
> message = new ByteArrayBuffer(receiveBuffer.getBytes());
> receiveBuffer.compact();
> }
> }
> }
> if (message != null) {
> synchronized (messages) {
> messages.offer(message);
> messages.notifyAll();
> }
> }
> }
> {code}
> After two munites, my console displayed
> '[sshd-SshClient[720b3c53]-timer-thread-1] INFO
> org.apache.sshd.client.session.ClientSessionImpl -
> Disconnecting(ClientSessionImpl[root@/10.10.16.201:8022]):
> SSH2_DISCONNECT_PROTOCOL_ERROR - Session has timed out waiting for
> authentication after 120000 ms.' every second, and finally lead to
> OutOfMemory Error.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]