[Gradle] KotlinToolRunner: Capture System.getProperties() as List

This is done to avoid a potential `ConcurrentModificationException`:

```
Caused by: java.util.ConcurrentModificationException
  at java.util.Hashtable$Enumerator.next(Hashtable.java:1387)
  at org.gradle.internal.classpath.Instrumented$DecoratingEntrySet$1.computeNext(Instrumented.java:349)
  at org.gradle.internal.classpath.Instrumented$DecoratingEntrySet$1.computeNext(Instrumented.java:343)
  at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
  at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
  at kotlin.sequences.TransformingSequence$iterator$1.hasNext(Sequences.kt:176)
  at kotlin.sequences.FilteringSequence$iterator$1.calcNext(Sequences.kt:131)
  at kotlin.sequences.FilteringSequence$iterator$1.hasNext(Sequences.kt:156)
  at kotlin.collections.MapsKt__MapsKt.putAll(Maps.kt:419)
  at kotlin.collections.MapsKt__MapsKt.toMap(Maps.kt:587)
  at kotlin.collections.MapsKt__MapsKt.toMap(Maps.kt:581)
  at org.jetbrains.kotlin.compilerRunner.KotlinToolRunner.runViaExec(KotlinToolRunner.kt:95)
  at org.jetbrains.kotlin.compilerRunner.KotlinToolRunner.run(KotlinToolRunner.kt:85)
```
This commit is contained in:
sebastian.sellmair
2022-06-15 14:52:48 +02:00
committed by Space
parent 642b403232
commit 66d344975b
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.konan.target.HostManager
import java.io.File
import java.lang.reflect.InvocationTargetException
import java.net.URLClassLoader
import java.util.*
import java.util.concurrent.ConcurrentHashMap
// Note: this class is public because it is used in the K/N build infrastructure.
@@ -88,7 +89,10 @@ abstract class KotlinToolRunner(
private fun runViaExec(args: List<String>) {
val transformedArgs = transformArgs(args)
val classpath = project.files(classpath)
val systemProperties = System.getProperties().asSequence()
val systemProperties = System.getProperties()
/* Capture 'System.getProperties()' as List to avoid potential 'ConcurrentModificationException' */
.toListSynchronized()
.asSequence()
.map { (k, v) -> k.toString() to v.toString() }
.filter { (k, _) -> k !in execSystemPropertiesBlacklist }
.escapeQuotesForWindows()
@@ -173,5 +177,10 @@ abstract class KotlinToolRunner(
any { it == '"' || it.isWhitespace() } -> '"' + escapeStringCharacters(this) + '"'
else -> this
}
/**
* Safely enter the [Properties] monitor and capture the current values
*/
private fun Properties.toListSynchronized(): List<Pair<Any, Any>> = synchronized(this) { toList() }
}
}