Uploaded image for project: 'Commons Exec'
  1. Commons Exec
  2. EXEC-102

"Stream closed" error in Java 8 when passing input to processes that don't consume it

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: 1.3
    • Fix Version/s: None
    • Labels:
      None

      Description

      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.

      We have observed this behavior with both Oracle JDK8 and OpenJDK8, and on various Red Hat Linux and Ubuntu Linux systems, and also on Mac OSX.

      Here is a simple reproducer:

      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"));
          }
      }
      

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

      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)
      

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                sgoeschl Siegfried Goeschl
                Reporter:
                cprice-puppet Chris Price
              • Votes:
                0 Vote for this issue
                Watchers:
                3 Start watching this issue

                Dates

                • Created:
                  Updated: