From 1b1c3dbe43edb753e38f18730b6e6d43bf907d09 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 ea44573d..5b32effe 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 @@ -27,7 +35,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 8c99ee85..31cbaa53 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 @@ -410,14 +410,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 e8fd2148..e55d572a 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; @@ -202,6 +204,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 aebfdc16..e245c3c0 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 0d7a6d83..ccebd15a 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 @@ -318,6 +318,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.25.0