1
0
mirror of https://github.com/mamoe/mirai.git synced 2025-04-25 21:23:55 +08:00

[core] Fix potential memory leak with buildPacket

This commit is contained in:
Him188 2022-10-29 11:36:08 +01:00
parent 9818c08054
commit 81a09549e7
No known key found for this signature in database
GPG Key ID: BA439CDDCF652375

View File

@ -49,9 +49,9 @@ internal inline fun BytePacketBuilder.writeShortLVByteArray(byteArray: ByteArray
internal inline fun BytePacketBuilder.writeIntLVPacket(
tag: UByte? = null,
lengthOffset: ((Long) -> Long) = { it },
builder: BytePacketBuilder.() -> Unit,
crossinline builder: BytePacketBuilder.() -> Unit,
): Int =
BytePacketBuilder().apply(builder).build().use {
buildPacket(builder).use {
if (tag != null) writeUByte(tag)
val length = lengthOffset.invoke(it.remaining).coerceAtMostOrFail(0xFFFFFFFFL)
writeInt(length.toInt())
@ -62,15 +62,14 @@ internal inline fun BytePacketBuilder.writeIntLVPacket(
internal inline fun BytePacketBuilder.writeShortLVPacket(
tag: UByte? = null,
lengthOffset: ((Long) -> Long) = { it },
builder: BytePacketBuilder.() -> Unit,
): Int =
BytePacketBuilder().apply(builder).build().use {
if (tag != null) writeUByte(tag)
val length = lengthOffset.invoke(it.remaining).coerceAtMostOrFail(0xFFFFFFFFL)
writeUShort(length.toUShort())
writePacket(it)
return length.toInt()
}
crossinline builder: BytePacketBuilder.() -> Unit,
): Int = buildPacket(builder).use {
if (tag != null) writeUByte(tag)
val length = lengthOffset.invoke(it.remaining).coerceAtMostOrFail(0xFFFFFFFFL)
writeUShort(length.toUShort())
writePacket(it)
return length.toInt()
}
internal inline fun BytePacketBuilder.writeShortLVString(str: String) = writeShortLVByteArray(str.toByteArray())
@ -83,5 +82,7 @@ internal fun BytePacketBuilder.writeHex(uHex: String) {
}
internal inline fun BytePacketBuilder.encryptAndWrite(key: ByteArray, encoder: BytePacketBuilder.() -> Unit) =
TEA.encrypt(BytePacketBuilder().apply(encoder).build(), key) { decrypted -> writeFully(decrypted) }
internal inline fun BytePacketBuilder.encryptAndWrite(
key: ByteArray,
crossinline encoder: BytePacketBuilder.() -> Unit
) = TEA.encrypt(buildPacket(encoder), key) { decrypted -> writeFully(decrypted) }