From d49ff1aa2c2fc082d1ec609d39c8420b9339b5a7 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Tue, 28 Aug 2018 08:17:37 +0300 Subject: [PATCH] [K/N lib] Add timeout for native dependency extraction --- .../kotlin/konan/util/DependencyExtractor.kt | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/konan/utils/src/org/jetbrains/kotlin/konan/util/DependencyExtractor.kt b/konan/utils/src/org/jetbrains/kotlin/konan/util/DependencyExtractor.kt index f0ade14d1fb..617cd1a5fd5 100644 --- a/konan/utils/src/org/jetbrains/kotlin/konan/util/DependencyExtractor.kt +++ b/konan/utils/src/org/jetbrains/kotlin/konan/util/DependencyExtractor.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.konan.util import org.jetbrains.kotlin.konan.file.unzipTo import java.io.File +import java.util.concurrent.TimeUnit internal class DependencyExtractor { private val useZip = System.getProperty("os.name").startsWith("Windows") @@ -21,10 +22,22 @@ internal class DependencyExtractor { val tarProcess = ProcessBuilder().apply { command("tar", "-xzf", tarGz.canonicalPath) directory(targetDirectory) + inheritIO() }.start() - tarProcess.waitFor() - if (tarProcess.exitValue() != 0) { - throw RuntimeException("Cannot extract archive with dependency: ${tarGz.canonicalPath}") + val finished = tarProcess.waitFor(extractionTimeout, extractionTimeoutUntis) + when { + finished && tarProcess.exitValue() != 0 -> + throw RuntimeException( + "Cannot extract archive with dependency: ${tarGz.canonicalPath}.\n" + + "Tar exit code: ${tarProcess.exitValue()}." + ) + !finished -> { + tarProcess.destroy() + throw RuntimeException( + "Cannot extract archive with dependency: ${tarGz.canonicalPath}.\n" + + "Tar process hasn't finished in ${extractionTimeoutUntis.toSeconds(extractionTimeout)} sec." + ) + } } } @@ -35,4 +48,9 @@ internal class DependencyExtractor { extractTarGz(archive, targetDirectory) } } + + companion object { + val extractionTimeout = 3600L + val extractionTimeoutUntis = TimeUnit.SECONDS + } } \ No newline at end of file