mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-09-06 11:48:05 +02:00
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: 39a80e41 #3093: Support names with '.', block names with ' ' ab9153dd Further increase length limit for TO_CLIENT chat packets 7ec1f487 Remove ipv6 scope from forwarded addresses
127 lines
5.8 KiB
Diff
127 lines
5.8 KiB
Diff
From 13cfd996d8e278f969fc503fffc5773219584361 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 de94bfda..4b16a50f 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
|
|
@@ -475,14 +475,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 cb722d78..b0e7e392 100644
|
|
--- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java
|
|
+++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java
|
|
@@ -72,6 +72,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.31.1.windows.1
|
|
|