mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-12-01 06:33:39 +01:00
297 lines
12 KiB
Diff
297 lines
12 KiB
Diff
From 3f7b0d3a64c7e0b7909bb3394954bfa2501ad8fb Mon Sep 17 00:00:00 2001
|
|
From: Techcable <Techcable@techcable.net>
|
|
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> R peek(ByteBuf buf, Function<ByteBuf, R> 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
|
|
|