[JPS] Improved processing of broken caches
If serialized metadata version has evidently incorrect size the module
should be marked for rebuild prior to reading serialized version.
#KT-42194 Fixed
(cherry picked from commit 4ad828f80ffd4199c258e0a57e6714daf6a5c770)
diff --git a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/ModuleMapping.kt b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/ModuleMapping.kt
index f130177..5d8de44 100644
--- a/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/ModuleMapping.kt
+++ b/core/metadata.jvm/src/org/jetbrains/kotlin/metadata/jvm/deserialization/ModuleMapping.kt
@@ -39,7 +39,11 @@
fun readVersionNumber(stream: DataInputStream): IntArray? =
try {
- IntArray(stream.readInt()) { stream.readInt() }
+ val size = stream.readInt()
+ if (size < 0 || size > BinaryVersion.MAX_LENGTH)
+ null // cache is evidently corrupted
+ else
+ IntArray(size) { stream.readInt() }
} catch (e: IOException) {
null
}
diff --git a/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/BinaryVersion.kt b/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/BinaryVersion.kt
index 10163e9..70a9bc2 100644
--- a/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/BinaryVersion.kt
+++ b/core/metadata/src/org/jetbrains/kotlin/metadata/deserialization/BinaryVersion.kt
@@ -18,7 +18,12 @@
val major: Int = numbers.getOrNull(0) ?: UNKNOWN
val minor: Int = numbers.getOrNull(1) ?: UNKNOWN
val patch: Int = numbers.getOrNull(2) ?: UNKNOWN
- val rest: List<Int> = if (numbers.size > 3) numbers.asList().subList(3, numbers.size).toList() else emptyList()
+ val rest: List<Int> = if (numbers.size > 3) {
+ if (numbers.size > MAX_LENGTH)
+ throw IllegalArgumentException("BinaryVersion with length more than $MAX_LENGTH are not supported. Provided length ${numbers.size}.")
+ else
+ numbers.asList().subList(3, numbers.size).toList()
+ } else emptyList()
abstract fun isCompatible(): Boolean
@@ -80,6 +85,7 @@
}
companion object {
+ const val MAX_LENGTH = 1024
private const val UNKNOWN = -1
@JvmStatic