From 8056d2b9940e8bcf664c633e97f1a4068308dfe3 Mon Sep 17 00:00:00 2001 From: Techcable 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 773e954c..57bd22b7 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 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 out) throws Exception @@ -34,7 +42,7 @@ public class MinecraftDecoder extends MessageToMessageDecoder { 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 746defae..dabfa4db 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 @@ -655,14 +655,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 || id < 0 ) + 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 1255298c..aa721cdc 100644 --- a/proxy/src/main/java/net/md_5/bungee/ServerConnector.java +++ b/proxy/src/main/java/net/md_5/bungee/ServerConnector.java @@ -34,7 +34,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; @@ -208,6 +210,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 d642e68d..bac51311 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 81146df6..5ecca5a0 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 @@ -335,6 +335,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.37.3.windows.1