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

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

                Author: ASF GitHub Bot
            Created on: 26/Feb/21 15:51
            Start Date: 26/Feb/21 15:51
    Worklog Time Spent: 10m 
      Work Description: lgoldstein commented on a change in pull request #181:
URL: https://github.com/apache/mina-sshd/pull/181#discussion_r583735728



##########
File path: 
sshd-core/src/main/java/org/apache/sshd/common/channel/BufferedIoOutputStream.java
##########
@@ -52,60 +78,164 @@ public Object getId() {
     @Override
     public IoWriteFuture writeBuffer(Buffer buffer) throws IOException {
         if (isClosing()) {
-            throw new EOFException("Closed - state=" + state);
+            throw new EOFException("Closed/ing - state=" + state);
         }
 
+        waitForAvailableWriteSpace(buffer.available());
+
         IoWriteFutureImpl future = new IoWriteFutureImpl(getId(), buffer);
         writes.add(future);
         startWriting();
         return future;
     }
 
+    protected void waitForAvailableWriteSpace(int requiredSize) throws 
IOException {
+        long expireTime = System.currentTimeMillis() + 
maxWaitForPendingWrites.toMillis();
+        synchronized (pendingBytesCount) {
+            for (int count = pendingBytesCount.get();
+                 /*
+                  * The (count > 0) condition is put in place to allow a 
single pending
+                  * write to exceed the maxPendingBytesCount as long as there 
are no
+                  * other pending writes.
+                  */
+                 (count > 0)
+                         // Not already over the limit or about to be over it
+                         && ((count >= maxPendingBytesCount) || ((count + 
requiredSize) > maxPendingBytesCount))
+                         // No pending exception signaled
+                         && (pendingException.get() == null);
+                 count = pendingBytesCount.get()) {
+                long remTime = expireTime - System.currentTimeMillis();
+                if (remTime <= 0L) {
+                    pendingException.compareAndSet(null,
+                            new SshChannelBufferedOutputException(
+                                    channelId,
+                                    "Max. pending write timeout expired after 
" + writtenBytesCount + " bytes"));
+                    throw pendingException.get();
+                }
+
+                try {
+                    pendingBytesCount.wait(remTime);
+                } catch (InterruptedException e) {
+                    pendingException.compareAndSet(null,
+                            new SshChannelBufferedOutputException(
+                                    channelId,
+                                    "Waiting for pending writes interrupted 
after " + writtenBytesCount + " bytes"));
+                    throw pendingException.get();

Review comment:
       Great - opening an issue for it...




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


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

    Worklog Id:     (was: 558597)
    Time Spent: 1h 40m  (was: 1.5h)

> Provide a boundary on BufferedIoOutputStream writing to avoid memory overflow
> -----------------------------------------------------------------------------
>
>                 Key: SSHD-1125
>                 URL: https://issues.apache.org/jira/browse/SSHD-1125
>             Project: MINA SSHD
>          Issue Type: Bug
>            Reporter: Lyor Goldstein
>            Assignee: Lyor Goldstein
>            Priority: Major
>              Labels: memory
>          Time Spent: 1h 40m
>  Remaining Estimate: 0h
>
> Use an upper bound to the data pending in the {{BufferedIoOutputStream}}. The 
> max data could be set to the max window size.  Blocking until there is enough 
> room should allow the client to read the data.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to