From be6cd00b81ae155a94f93e40a0f182e8fb6b51bf Mon Sep 17 00:00:00 2001 From: "Daniel C. Sobral" Date: Fri, 17 Feb 2012 17:51:04 -0200 Subject: [PATCH] Fix file descriptor leak. Close an InputStream when finished reading it. When given an OutputStream to connect to a process input, close it when the transfer is completed. Protect System.in in this latter case. --- util/process/ProcessImpl.scala | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/util/process/ProcessImpl.scala b/util/process/ProcessImpl.scala index 69191d054..f29d8bfa3 100644 --- a/util/process/ProcessImpl.scala +++ b/util/process/ProcessImpl.scala @@ -51,7 +51,6 @@ object BasicIO private def processErrFully(log: ProcessLogger) = processFully(s => log.error(s)) private def processInfoFully(log: ProcessLogger) = processFully(s => log.info(s)) - def ignoreOut = (i: OutputStream) => () final val BufferSize = 8192 final val Newline = System.getProperty("line.separator") @@ -62,6 +61,7 @@ object BasicIO { val reader = new BufferedReader(new InputStreamReader(in)) processLinesFully(processLine)(reader.readLine) + reader.close() } def processLinesFully(processLine: String => Unit)(readLine: () => String) { @@ -76,8 +76,11 @@ object BasicIO } readFully() } - def connectToIn(o: OutputStream) { transferFully(System.in, o) } - def input(connect: Boolean): OutputStream => Unit = if(connect) connectToIn else ignoreOut + def connectToIn(o: OutputStream) { transferFully(Uncloseable protect System.in, o) } + def input(connect: Boolean): OutputStream => Unit = { outputToProcess => + if(connect) connectToIn(outputToProcess) + else outputToProcess.close() + } def standard(connectInput: Boolean): ProcessIO = standard(input(connectInput)) def standard(in: OutputStream => Unit): ProcessIO = new ProcessIO(in, toStdOut, toStdErr) @@ -110,6 +113,7 @@ object BasicIO } } read + in.close() } } @@ -469,4 +473,4 @@ private object Streamed } } -private final class Streamed[T](val process: T => Unit, val done: Int => Unit, val stream: () => Stream[T]) extends NotNull \ No newline at end of file +private final class Streamed[T](val process: T => Unit, val done: Int => Unit, val stream: () => Stream[T]) extends NotNull