From b2372ff0b99a848ab9c6aa1f24da23a988c8b323 Mon Sep 17 00:00:00 2001 From: bracadabra Date: Mon, 1 Mar 2021 09:35:57 +0300 Subject: [PATCH] Fix UTFDataFormatException on encoding long subplugin options. ObjectOutputStream.writeUTF(String) has an unsigned short limit on String length. On Projects with deep nested modules subplugin options could produce String over this limit. ^KT-45202 Fixed --- compiler/util/src/org/jetbrains/kotlin/utils/pluginUtils.kt | 6 +++++- .../org/jetbrains/kotlin/gradle/internal/subpluginUtils.kt | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/pluginUtils.kt b/compiler/util/src/org/jetbrains/kotlin/utils/pluginUtils.kt index f20432cf4f9..2b0234036f7 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/pluginUtils.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/pluginUtils.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.utils import java.io.ByteArrayInputStream import java.io.ObjectInputStream +import java.nio.charset.StandardCharsets import java.util.* fun decodePluginOptions(options: String): Map> { @@ -36,7 +37,10 @@ fun decodePluginOptions(options: String): Map> { val values = mutableListOf() repeat(valueCount) { - values += ois.readUTF() + val size = ois.readInt() + val byteArray = ByteArray(size) + ois.readFully(byteArray) + values += String(byteArray, StandardCharsets.UTF_8) } map[key] = values diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/subpluginUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/subpluginUtils.kt index 57668f8be11..60bb6379f7f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/subpluginUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/subpluginUtils.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.gradle.tasks.CompilerPluginOptions import java.io.ByteArrayOutputStream import java.io.File import java.io.ObjectOutputStream +import java.nio.charset.StandardCharsets import java.util.* fun encodePluginOptions(options: Map>): String { @@ -35,7 +36,9 @@ fun encodePluginOptions(options: Map>): String { oos.writeInt(values.size) for (value in values) { - oos.writeUTF(value) + val valueBytes = value.toByteArray(StandardCharsets.UTF_8) + oos.writeInt(valueBytes.size) + oos.write(valueBytes) } }