From e4cd6a38fcaf2af2e0a0879d5c2136a05c3eb055 Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Sat, 25 Jul 2020 14:32:38 -0700 Subject: [PATCH] Hold lock while writing bytes to stdout We should always hold the print stream lock when calling progressState.write because otherwise the task progress thread could concurrently write to stdout. --- .../src/main/scala/sbt/internal/util/Terminal.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala index 9c832ec5e..deb6489f6 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala @@ -882,8 +882,9 @@ object Terminal { } override def flush(): Unit = combinedOutputStream.flush() } - private def doWrite(bytes: Array[Byte]): Unit = - progressState.write(TerminalImpl.this, bytes, rawPrintStream, hasProgress.get && !rawMode.get) + private def doWrite(bytes: Array[Byte]): Unit = withPrintStream { ps => + progressState.write(TerminalImpl.this, bytes, ps, hasProgress.get && !rawMode.get) + } override private[sbt] val printStream: PrintStream = new LinePrintStream(outputStream) override def inputStream: InputStream = writeableInputStream