Chris Price created EXEC-102:
--------------------------------

             Summary: "Stream closed" error in Java 8 when passing input to 
processes that don't consume it
                 Key: EXEC-102
                 URL: https://issues.apache.org/jira/browse/EXEC-102
             Project: Commons Exec
          Issue Type: Bug
            Reporter: Chris Price


When trying to pass an InputStream to a process (i.e. for it to be used as 
STDIN), I am getting an IOException in Java 8 that I did not get in Java 7.

Here is a simple reproducer:

{code}
package foo;

import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.Executor;
import org.apache.commons.exec.PumpStreamHandler;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class CommonsExecBinTrue {
    public static void main(String[] args) throws IOException {

        Executor exec = new DefaultExecutor();

        CommandLine cl = new CommandLine("/bin/true");

        String text = "hello";
        ByteArrayInputStream input =
                new ByteArrayInputStream(text.getBytes("UTF-8"));
        ByteArrayOutputStream output = new ByteArrayOutputStream();

        exec.setStreamHandler(new PumpStreamHandler(output, null, input));
        exec.execute(cl);

        System.out.println("result: " + output.toString("UTF-8"));
    }
}
{code}

This program would work fine in Java 7, but in Java 8 it fails with this stack 
trace:

{code}
Exception in thread "main" java.io.IOException: Stream closed
        at 
java.lang.ProcessBuilder$NullOutputStream.write(ProcessBuilder.java:433)
        at java.io.OutputStream.write(OutputStream.java:116)
        at 
java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
        at java.io.FilterOutputStream.close(FilterOutputStream.java:158)
        at 
org.apache.commons.exec.DefaultExecutor.closeProcessStreams(DefaultExecutor.java:306)
        at 
org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:387)
        at 
org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:166)
        at 
org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:153)
        at foo.CommonsExecBinTrue.main(CommonsExecBinTrue.java:27)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to