From ac891c1ef1e4f8481afda79255a48c298e9c72c4 Mon Sep 17 00:00:00 2001 From: 3944Realms Date: Sat, 6 Jun 2026 03:31:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=86=85=E5=AE=B9=EF=BC=88FM?= =?UTF-8?q?L2CRPMResetCompleteDecoder.java=EF=BC=89=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 对于非 0x02 的数据包:直接释放缓冲区并返回。在重置阶段,唯一需要关注的是 0x02(Login Plugin Response)数据包。其他数据包(如延迟的 PLAY 状态数据包)无法被处于 LOGIN 状态的 MinecraftDecoder 解码,因此安全丢弃。 对于 0x02 + id=98 的数据包:在拦截后添加 buf.release() 来修复内存泄漏。 --- build.gradle.kts | 2 +- .../client/FML2CRPMResetCompleteDecoder.java | 29 +++++++------------ 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4714c9a..e9c2d90 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "org.adde0109" -version = "1.4.5-fix1" +version = "1.4.5-fix2" repositories { mavenCentral() diff --git a/src/main/java/org/adde0109/ambassador/velocity/client/FML2CRPMResetCompleteDecoder.java b/src/main/java/org/adde0109/ambassador/velocity/client/FML2CRPMResetCompleteDecoder.java index 256827e..bb21a50 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/client/FML2CRPMResetCompleteDecoder.java +++ b/src/main/java/org/adde0109/ambassador/velocity/client/FML2CRPMResetCompleteDecoder.java @@ -20,42 +20,35 @@ public class FML2CRPMResetCompleteDecoder extends ChannelInboundHandlerAdapter { int originalReaderIndex = buf.readerIndex(); int packetId = ProtocolUtils.readVarInt(buf); - if (packetId == 0x02 && buf.readableBytes() > 1) { + if (packetId != 0x02) { + buf.release(); + return; + } + if (buf.readableBytes() > 1) { try { int id = ProtocolUtils.readVarInt(buf); boolean success = buf.readBoolean(); if (id == 98) { try { - // 读取剩余的所有数据 int remainingBytes = buf.readableBytes(); - ByteBuf remainingData; - if (remainingBytes > 0) { - // 有剩余数据,读取它们 - remainingData = Unpooled.buffer(remainingBytes); + ByteBuf remainingData = Unpooled.buffer(remainingBytes); remainingData.writeBytes(buf, remainingBytes); - - // 调试日志(可选,可删除) - System.out.println("[Ambassador] FML2CRPM packet - id: 98, success: " + success + - ", captured " + remainingBytes + " extra bytes"); + IForgeLoginWrapperPacket packet = new GenericForgeLoginWrapperPacket(remainingData, id, success); + ctx.fireChannelRead(packet); } else { - // 没有剩余数据,使用空缓冲区 - remainingData = Unpooled.EMPTY_BUFFER; + IForgeLoginWrapperPacket packet = new GenericForgeLoginWrapperPacket(Unpooled.EMPTY_BUFFER, id, success); + ctx.fireChannelRead(packet); } - - IForgeLoginWrapperPacket packet = new GenericForgeLoginWrapperPacket(remainingData, id, success); - ctx.fireChannelRead(packet); } catch (Exception e) { - // 出错时记录日志 System.err.println("[Ambassador] Error creating FML2CRPM packet: " + e.getMessage()); } + buf.release(); return; } } catch (Exception ignored) { - // 忽略解析错误,回退到正常处理 } } - // 恢复读取位置 buf.readerIndex(originalReaderIndex); } ctx.fireChannelRead(msg);