From 3f7b0d3a64c7e0b7909bb3394954bfa2501ad8fb Mon Sep 17 00:00:00 2001 From: Techcable Date: Fri, 7 Apr 2017 20:19:15 -0700 Subject: [PATCH] Dump a packet's raw hex if entity rewriting fails. diff --git a/proxy/src/main/java/io/github/waterfallmc/waterfall/utils/BufUtils.java b/proxy/src/main/java/io/github/waterfallmc/waterfall/utils/BufUtils.java new file mode 100644 index 00000000..c21a707a --- /dev/null +++ b/proxy/src/main/java/io/github/waterfallmc/waterfall/utils/BufUtils.java @@ -0,0 +1,40 @@ +package io.github.waterfallmc.waterfall.utils; + +import java.util.function.Function; + +import io.netty.buffer.ByteBuf; +import net.md_5.bungee.protocol.DefinedPacket; + +public final class BufUtils { + private BufUtils() {} + + /** + * Read a varint from the ByteBuf without changing the index. + */ + public static int peekVarInt(ByteBuf buf) { + return peek(buf, DefinedPacket::readVarInt); + } + + /** + * Read values from the byte buf, then reset it's indexes to the old value. + * + * This effectively 'peeks' at values ahead of the index. + * This is preferable to `resetWriterIndex` and `resetReaderIndex`, + * since it doesn't rely on the buffer's mark. + * + * @param buf the buffer to peek from + * @param func the function that should peek values + * @return the value returned from the function + * @throws Throwable any exception thrown by the callable + */ + public static R peek(ByteBuf buf, Function func) { + int oldReaderIndex = buf.readerIndex(); + int oldWriterIndex = buf.writerIndex(); + try { + return func.apply(buf); + } finally { + buf.readerIndex(oldReaderIndex); + buf.writerIndex(oldWriterIndex); + } + } +} diff --git a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java index d98a8056..736bd599 100644 --- a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java +++ b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap.java @@ -10,6 +10,12 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import net.md_5.bungee.protocol.DefinedPacket; import net.md_5.bungee.protocol.ProtocolConstants; +// Waterfall start +import io.github.waterfallmc.waterfall.utils.BufUtils; +import io.netty.buffer.ByteBufUtil; +import io.netty.handler.codec.DecoderException; +import net.md_5.bungee.protocol.BadPacketException; +// Waterfall end /** * Class to rewrite integers within packets. @@ -66,13 +72,51 @@ public abstract class EntityMap } } - public void rewriteServerbound(ByteBuf packet, int oldId, int newId) + // Waterfall start - wrap rewrite calls to provide descriptive error messages + public final void rewriteServerbound(ByteBuf packet, int oldId, int newId) { + Integer packetId = null; + ByteBuf originalPacket = packet.copy(); // EntityMap modifies in place, so we need a copy :( + try { + packetId = BufUtils.peekVarInt(packet); + rewriteServerbound0(packet, oldId, newId); + } catch (BadPacketException | IndexOutOfBoundsException e) { + String packetType = packetId != null ? "id " + Integer.toHexString(packetId) : "unknown"; + throw new DecoderException( + "Error rewriting packet " + + packetType + + " with contents:\n" + + ByteBufUtil.prettyHexDump(originalPacket), + e + ); + } + } + + public final void rewriteClientbound(ByteBuf packet, int oldId, int newId) { + Integer packetId = null; + ByteBuf originalPacket = packet.copy(); // EntityMap modifies in place, so we need a copy :( + try { + packetId = BufUtils.peekVarInt(packet); + rewriteClientbound0(packet, oldId, newId); + } catch (BadPacketException | IndexOutOfBoundsException e) { + String packetType = packetId != null ? "id " + Integer.toHexString(packetId) : "unknown"; + throw new DecoderException( + "Error rewriting packet " + + packetType + + " with contents:\n" + + ByteBufUtil.prettyHexDump(originalPacket), + e + ); + } + } + + protected void rewriteServerbound0(ByteBuf packet, int oldId, int newId) { rewrite( packet, oldId, newId, serverboundInts, serverboundVarInts ); } - public void rewriteClientbound(ByteBuf packet, int oldId, int newId) + protected void rewriteClientbound0(ByteBuf packet, int oldId, int newId) { + // Waterfall end rewrite( packet, oldId, newId, clientboundInts, clientboundVarInts ); } diff --git a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_10.java b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_10.java index a89ea2e9..0de5ce25 100644 --- a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_10.java +++ b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_10.java @@ -49,9 +49,11 @@ class EntityMap_1_10 extends EntityMap @Override @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") - public void rewriteClientbound(ByteBuf packet, int oldId, int newId) + // Waterfall start - rewriteClientbound -> rewriteClientbound0 + protected void rewriteClientbound0(ByteBuf packet, int oldId, int newId) { - super.rewriteClientbound( packet, oldId, newId ); + super.rewriteClientbound0( packet, oldId, newId ); + // Waterfall end // Special cases int readerIndex = packet.readerIndex(); @@ -151,10 +153,13 @@ class EntityMap_1_10 extends EntityMap packet.readerIndex( readerIndex ); } + // Waterfall start - rewriteServerbound -> rewriteServerbound0 @Override - public void rewriteServerbound(ByteBuf packet, int oldId, int newId) + public void rewriteServerbound0(ByteBuf packet, int oldId, int newId) { - super.rewriteServerbound( packet, oldId, newId ); + super.rewriteServerbound0( packet, oldId, newId ); + // Waterfall end + // Special cases int readerIndex = packet.readerIndex(); int packetId = DefinedPacket.readVarInt( packet ); diff --git a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_11.java b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_11.java index 260da17e..8a746116 100644 --- a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_11.java +++ b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_11.java @@ -49,9 +49,11 @@ class EntityMap_1_11 extends EntityMap @Override @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") - public void rewriteClientbound(ByteBuf packet, int oldId, int newId) + // Waterfall start - rewriteClientbound -> rewriteClientbound0 + protected void rewriteClientbound0(ByteBuf packet, int oldId, int newId) { - super.rewriteClientbound( packet, oldId, newId ); + super.rewriteClientbound0( packet, oldId, newId ); + // Waterfall end // Special cases int readerIndex = packet.readerIndex(); @@ -155,10 +157,13 @@ class EntityMap_1_11 extends EntityMap packet.readerIndex( readerIndex ); } + // Waterfall start - rewriteServerbound -> rewriteServerbound0 @Override - public void rewriteServerbound(ByteBuf packet, int oldId, int newId) + public void rewriteServerbound0(ByteBuf packet, int oldId, int newId) { - super.rewriteServerbound( packet, oldId, newId ); + super.rewriteServerbound0( packet, oldId, newId ); + // Waterfall end + // Special cases int readerIndex = packet.readerIndex(); int packetId = DefinedPacket.readVarInt( packet ); diff --git a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_8.java b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_8.java index 4229fefa..23f29a4b 100644 --- a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_8.java +++ b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_8.java @@ -49,9 +49,11 @@ class EntityMap_1_8 extends EntityMap @Override @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") - public void rewriteClientbound(ByteBuf packet, int oldId, int newId) + // Waterfall start - rewriteClientbound -> rewriteClientbound0 + protected void rewriteClientbound0(ByteBuf packet, int oldId, int newId) { - super.rewriteClientbound( packet, oldId, newId ); + super.rewriteClientbound0( packet, oldId, newId ); + // Waterfall end //Special cases int readerIndex = packet.readerIndex(); @@ -149,10 +151,13 @@ class EntityMap_1_8 extends EntityMap packet.readerIndex( readerIndex ); } + // Waterfall start - rewriteServerbound -> rewriteServerbound0 @Override - public void rewriteServerbound(ByteBuf packet, int oldId, int newId) + public void rewriteServerbound0(ByteBuf packet, int oldId, int newId) { - super.rewriteServerbound( packet, oldId, newId ); + super.rewriteServerbound0( packet, oldId, newId ); + // Waterfall end + //Special cases int readerIndex = packet.readerIndex(); int packetId = DefinedPacket.readVarInt( packet ); diff --git a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_9.java b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_9.java index 19d96776..80075eb4 100644 --- a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_9.java +++ b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_9.java @@ -49,9 +49,11 @@ class EntityMap_1_9 extends EntityMap @Override @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") - public void rewriteClientbound(ByteBuf packet, int oldId, int newId) + // Waterfall start - rewriteClientbound -> rewriteClientbound0 + protected void rewriteClientbound0(ByteBuf packet, int oldId, int newId) { - super.rewriteClientbound( packet, oldId, newId ); + super.rewriteClientbound0( packet, oldId, newId ); + // Waterfall end // Special cases int readerIndex = packet.readerIndex(); @@ -151,10 +153,13 @@ class EntityMap_1_9 extends EntityMap packet.readerIndex( readerIndex ); } + // Waterfall start - rewriteServerbound -> rewriteServerbound0 @Override - public void rewriteServerbound(ByteBuf packet, int oldId, int newId) + public void rewriteServerbound0(ByteBuf packet, int oldId, int newId) { - super.rewriteServerbound( packet, oldId, newId ); + super.rewriteServerbound0( packet, oldId, newId ); + // Waterfall end + // Special cases int readerIndex = packet.readerIndex(); int packetId = DefinedPacket.readVarInt( packet ); diff --git a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_9_4.java b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_9_4.java index 412ab4ed..ae5ce7f0 100644 --- a/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_9_4.java +++ b/proxy/src/main/java/net/md_5/bungee/entitymap/EntityMap_1_9_4.java @@ -49,9 +49,11 @@ class EntityMap_1_9_4 extends EntityMap @Override @SuppressFBWarnings("DLS_DEAD_LOCAL_STORE") - public void rewriteClientbound(ByteBuf packet, int oldId, int newId) + // Waterfall start - rewriteClientbound -> rewriteClientbound0 + protected void rewriteClientbound0(ByteBuf packet, int oldId, int newId) { - super.rewriteClientbound( packet, oldId, newId ); + super.rewriteClientbound0( packet, oldId, newId ); + // Waterfall end // Special cases int readerIndex = packet.readerIndex(); @@ -151,10 +153,13 @@ class EntityMap_1_9_4 extends EntityMap packet.readerIndex( readerIndex ); } + // Waterfall start - rewriteServerbound -> rewriteServerbound0 @Override - public void rewriteServerbound(ByteBuf packet, int oldId, int newId) + public void rewriteServerbound0(ByteBuf packet, int oldId, int newId) { - super.rewriteServerbound( packet, oldId, newId ); + super.rewriteServerbound0( packet, oldId, newId ); + // Waterfall end + // Special cases int readerIndex = packet.readerIndex(); int packetId = DefinedPacket.readVarInt( packet ); -- 2.12.2