mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-10-07 19:08:00 +02:00
ee819df91f
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
127 lines
5.8 KiB
Diff
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)
|
|
|