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

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

                Author: ASF GitHub Bot
            Created on: 21/Oct/22 20:05
            Start Date: 21/Oct/22 20:05
    Worklog Time Spent: 10m 
      Work Description: tomaswolf opened a new pull request, #256:
URL: https://github.com/apache/mina-sshd/pull/256

   Closing them when the channel closes leads to the strange situation that the 
application reads from an already closed InputStream. That's not a good idea.
   
   It's the caller's responsibility to close the input stream obtained from 
Channel.getInvertedOut() or getInvertedErr(). And of course it should do so 
only after it has read all the data it wanted, and the channel is closed.
   
   It's not a real problem if the stream is not closed (for instance, if the 
application never even called getInvertedOut() and never read anything). 
Closing doesn't do much anyway except awaking a potentially waiting read() 
call. Moreover, if the channel is short-lived and didn't transmit a lot of 
data, the application may well start reading from the stream only after the 
underlying SSH channel is already closed.
   
   One problem with this ChannelPipedInputStream is that it may buffer up to a 
full SSH channel window. If the window size is large, that may consume a lot of 
memory if the application only reads infrequently (or doesn't read at all). 
However, not reading from such a stream is bad practice anyway if there is any 
chance that there might be a substantial amount of data; as with processes, it 
may lead to a blocked execution when buffers fill up or the channel window is 
exhausted.




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

            Worklog Id:     (was: 819257)
    Remaining Estimate: 0h
            Time Spent: 10m

> Handling empty ChannelExec#getInvertedOut() to rely on InputStream
> ------------------------------------------------------------------
>
>                 Key: SSHD-1302
>                 URL: https://issues.apache.org/jira/browse/SSHD-1302
>             Project: MINA SSHD
>          Issue Type: Improvement
>    Affects Versions: 2.9.1
>         Environment: Java 8
>            Reporter: dgü
>            Assignee: Thomas Wolf
>            Priority: Major
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> Hello!
> If I read an input stream until end of it, and then read it again, it throws 
> an exception.
> Here is the test case:
> {code:java}
>             BufferedReader input;
>             String line;
>             //process.getInputStream() gets its value from 
> ChannelExec#getInvertedOut()
>             System.out.println("getInputStream: " + process.getInputStream());
>             input = new BufferedReader(new 
> InputStreamReader(process.getInputStream()));
>             while ((line = input.readLine()) != null) {
>                 System.out.println(line);
>             }
>             System.out.println("getInputStream: " + process.getInputStream());
>             input = new BufferedReader(new 
> InputStreamReader(process.getInputStream()));
>             while ((line = input.readLine()) != null) {
>                 System.out.println(line);
>             }
> {code}
> Here is an output excerpt:
> {quote}getInputStream: 
> org.apache.sshd.common.channel.ChannelPipedInputStream@bd8db5a
> total 0
> drwx------. 3 root root 17 Oct 17 10:31 
> systemd-private-c3ce924f90c24e4a86f637831f434fe3-chronyd.service-DwM2fR
> drwx------. 3 root root 17 Oct 14 13:22 
> systemd-private-e0701fd845894b6087a236a976c00b35-chronyd.service-2z3OOv
> getInputStream: org.apache.sshd.common.channel.ChannelPipedInputStream@bd8db5a
> Exception in thread "main" java.io.IOException: Pipe closed after 0 cycles
>       at 
> org.apache.sshd.common.channel.ChannelPipedInputStream.read(ChannelPipedInputStream.java:126)
>       at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
>       at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
>       at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
>       at java.io.InputStreamReader.read(InputStreamReader.java:184)
>       at java.io.BufferedReader.fill(BufferedReader.java:161)
>       at java.io.BufferedReader.readLine(BufferedReader.java:324)
>       at java.io.BufferedReader.readLine(BufferedReader.java:389){quote}
> It looks the input stream is closed.
> is it possible not to throw an exception to rely on java.io.InputStream ?
> Thanks in advance...



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to