Waterfall/BungeeCord-Patches/0017-Allow-invalid-packet-ids-for-forge-servers.patch
Thomas A ee819df91f Updated Upstream (BungeeCord)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

BungeeCord Changes:
6f7331e8 #3138, 3140: Check for the new leak detector netty flag
1b489bcc Attempt to fix java 8 native crash
da27924a #3115, #3125: Update natives build script, switch to Cloudflare zlib
15b39887 #3133: Directly disconnect on illegal chars
f9583a76 #3129: Replace ConnectTimeoutException with a more user-friendly string.
cb738188 #3126: Use suppliers instead of reflection for native impl generation.
a8b2f526 #3123: Apply exact vanilla string length limits for tab completion
ad50fc9a #3111: Check chat for illegal chars & moved length check into the packet class
2021-07-03 01:00:48 +02:00

127 lines
5.8 KiB
Diff

From 2129b8a17d2352058ee2cb5142c99e4023d3d90c Mon Sep 17 00:00:00 2001
From: Techcable <Techcable@techcable.net>
Date: Thu, 19 May 2016 17:09:22 -0600
Subject: [PATCH] Allow invalid packet ids for forge servers
Some forge mods (COFH) use negative packet ids instead of plugin channels for 'reasons'.
Vanilla servers still error on negative/invalid packets.
Original issue: https://github.com/WaterfallMC/Waterfall-Old/issues/11
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 d36b7f3c..5e03e175 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
@@ -16,6 +16,14 @@ public class MinecraftDecoder extends MessageToMessageDecoder<ByteBuf>
private final boolean server;
@Setter
private int protocolVersion;
+ @Setter
+ private boolean supportsForge = false;
+
+ public MinecraftDecoder(Protocol protocol, boolean server, int protocolVersion) {
+ this.protocol = protocol;
+ this.server = server;
+ this.protocolVersion = protocolVersion;
+ }
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception
@@ -34,7 +42,7 @@ public class MinecraftDecoder extends MessageToMessageDecoder<ByteBuf>
{
int packetId = DefinedPacket.readVarInt( in );
- DefinedPacket packet = prot.createPacket( packetId, protocolVersion );
+ DefinedPacket packet = prot.createPacket( packetId, protocolVersion, supportsForge );
if ( packet != null )
{
packet.read( in, prot.getDirection(), protocolVersion );
diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java b/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java
index f29355bb..1cec1657 100644
--- a/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java
+++ b/protocol/src/main/java/net/md_5/bungee/protocol/Protocol.java
@@ -518,14 +518,23 @@ public enum Protocol
return protocol;
}
+ public boolean hasPacket(int i, boolean supportsForge) {
+ return supportsForge || i >= 0 && i <= MAX_PACKET_ID;
+ }
+
public final DefinedPacket createPacket(int id, int version)
+ {
+ return createPacket(id, version, true);
+ }
+
+ public final DefinedPacket createPacket(int id, int version, boolean supportsForge)
{
ProtocolData protocolData = getProtocolData( version );
if ( protocolData == null )
{
throw new BadPacketException( "Unsupported protocol version " + version );
}
- if ( id > MAX_PACKET_ID )
+ if ( !hasPacket(id, supportsForge) )
{
throw new BadPacketException( "Packet with id " + id + " outside of range" );
}
diff --git a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
index 2762aede..a8516462 100644
--- a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
+++ b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java
@@ -32,7 +32,9 @@ import net.md_5.bungee.forge.ForgeUtils;
import net.md_5.bungee.netty.ChannelWrapper;
import net.md_5.bungee.netty.HandlerBoss;
import net.md_5.bungee.netty.PacketHandler;
+import net.md_5.bungee.netty.PipelineUtils;
import net.md_5.bungee.protocol.DefinedPacket;
+import net.md_5.bungee.protocol.MinecraftDecoder;
import net.md_5.bungee.protocol.PacketWrapper;
import net.md_5.bungee.protocol.Protocol;
import net.md_5.bungee.protocol.ProtocolConstants;
@@ -206,6 +208,12 @@ public class ServerConnector extends PacketHandler
ServerConnection server = new ServerConnection( ch, target );
ServerConnectedEvent event = new ServerConnectedEvent( user, server );
+
+ if (server.isForgeServer() && user.isForgeUser()) {
+ ((MinecraftDecoder) server.getCh().getHandle().pipeline().get(PipelineUtils.PACKET_DECODER)).setSupportsForge(true);
+ ((MinecraftDecoder) user.getCh().getHandle().pipeline().get(PipelineUtils.PACKET_DECODER)).setSupportsForge(true);
+ }
+
bungee.getPluginManager().callEvent( event );
ch.write( BungeeCord.getInstance().registerChannels( user.getPendingConnection().getVersion() ) );
diff --git a/proxy/src/main/java/net/md_5/bungee/UserConnection.java b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
index 8979ac22..d4348eb7 100644
--- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java
+++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
@@ -73,6 +73,7 @@ public final class UserConnection implements ProxiedPlayer
@NonNull
private final ProxyServer bungee;
@NonNull
+ @Getter
private final ChannelWrapper ch;
@Getter
@NonNull
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 93989ee9..2e6cf764 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
@@ -324,6 +324,12 @@ public abstract class EntityMap
int packetId = DefinedPacket.readVarInt( packet );
int packetIdLength = packet.readerIndex() - readerIndex;
+ if (packetId < 0 || packetId > ints.length || packetId > varints.length) { // Invalid packet id
+ // Ignore these invalid packets for compatibility reasons
+ packet.readerIndex( readerIndex );
+ return;
+ }
+
if ( ints[packetId] )
{
rewriteInt( packet, oldId, newId, readerIndex + packetIdLength );
--
2.30.1 (Apple Git-130)