From 26e5efd5327231309bb9dcfc080e59baec9d6767 Mon Sep 17 00:00:00 2001 From: Techcable Date: Thu, 4 Aug 2016 19:30:49 -0700 Subject: [PATCH] Dump the raw hex of a packet on a decoding error diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java index 250e7620..2207c3ff 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/MinecraftDecoder.java @@ -1,7 +1,9 @@ package net.md_5.bungee.protocol; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.DecoderException; import io.netty.handler.codec.MessageToMessageDecoder; import java.util.List; import lombok.AllArgsConstructor; @@ -40,13 +42,16 @@ public class MinecraftDecoder extends MessageToMessageDecoder Protocol.DirectionData prot = ( server ) ? protocol.TO_SERVER : protocol.TO_CLIENT; ByteBuf slice = in.copy(); // Can't slice this one due to EntityMap :( + Object packetTypeInfo = null; try { int packetId = DefinedPacket.readVarInt( in ); + packetTypeInfo = packetId; DefinedPacket packet = prot.createPacket( packetId, protocolVersion, supportsForge ); if ( packet != null ) { + packetTypeInfo = packet.getClass(); packet.read( in, protocol, prot.getDirection(), protocolVersion ); if ( in.isReadable() ) @@ -60,6 +65,16 @@ public class MinecraftDecoder extends MessageToMessageDecoder out.add( new PacketWrapper( packet, slice, protocol ) ); slice = null; + } catch (BadPacketException | IndexOutOfBoundsException e) { + final String packetTypeStr; + if (packetTypeInfo instanceof Integer) { + packetTypeStr = "id " + Integer.toHexString((Integer) packetTypeInfo); + } else if (packetTypeInfo instanceof Class) { + packetTypeStr = "class " + ((Class) packetTypeInfo).getSimpleName(); + } else { + packetTypeStr = "unknown"; + } + throw new DecoderException("Error decoding packet " + packetTypeStr + " with contents:\n" + ByteBufUtil.prettyHexDump(slice), e); } finally { if ( slice != null ) -- 2.44.0