From 27685087bea39d231aaa2a76584786d3633719eb Mon Sep 17 00:00:00 2001 From: Azalea Date: Tue, 16 Jun 2026 01:08:58 +0000 Subject: [PATCH] Reapply "[F] Fix aimedb memory leak" This reverts commit fec348096350293c33c1e0247fed3c0cca6b6efc. --- .../icu/samnyan/aqua/sega/aimedb/AimeDB.kt | 2 +- .../samnyan/aqua/sega/aimedb/AimeDbDecoder.kt | 22 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDB.kt b/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDB.kt index a24dc034..330325c3 100644 --- a/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDB.kt +++ b/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDB.kt @@ -46,7 +46,7 @@ class AimeDB( keychipId = readPaddedString(12u) // 14 12b ) - fun ByteBuf.readPaddedString(maxLen: UInt) = readBytes(maxLen.toInt()).toString(US_ASCII).trimEnd('\u0000') + fun ByteBuf.readPaddedString(maxLen: UInt) = readCharSequence(maxLen.toInt(), US_ASCII).toString().trimEnd('\u0000') data class Handler(val name: String, val fn: (ByteBuf) -> ByteBuf?) diff --git a/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDbDecoder.kt b/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDbDecoder.kt index fa3ccb6e..7f56bdc6 100644 --- a/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDbDecoder.kt +++ b/src/main/java/icu/samnyan/aqua/sega/aimedb/AimeDbDecoder.kt @@ -28,8 +28,11 @@ class AimeDbDecoder : ByteToMessageDecoder() { // Create a byte array to store the encrypted data val d = input.readBytes(length) - val result = AimeDbEncryption.decrypt(d) - d.release() + val result = try { + AimeDbEncryption.decrypt(d) + } finally { + d.release() + } val resultMap = mapOf( "type" to result.getShortLE(0x04).toInt(), @@ -50,13 +53,16 @@ class AimeDbDecoder : ByteToMessageDecoder() { private fun getLength(input: ByteBuf): Int = try { val currentPos = input.readerIndex() val result = AimeDbEncryption.decrypt(input) + try { + // Check the header + val header = result.getByte(0).toInt() + assert(header == 0x3e) { "AimeDB: Invalid header $header" } - // Check the header - val header = result.getByte(0).toInt() - assert(header == 0x3e) { "AimeDB: Invalid header $header" } - - // Read the length from offset 6 - result.getShortLE(currentPos + 6).toInt() + // Read the length from offset 6 + result.getShortLE(currentPos + 6).toInt() + } finally { + result.release() + } } catch (e: Exception) { logger.info("AimeDB: Invalid request received") logger.debug("AimeDB: Invalid request received: ${input.toString(Charsets.UTF_8)}")