From 4487e175bf2121239ffe3d12bb584c51fddb3e09 Mon Sep 17 00:00:00 2001 From: foss-mc <69294560+foss-mc@users.noreply.github.com> Date: Wed, 16 Dec 2020 18:06:17 +0800 Subject: [PATCH] Close connections & Don't flush if not necessary diff --git a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java index 23571d40..1ec75614 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java @@ -195,6 +195,13 @@ public class InitialHandler extends PacketHandler implements PendingConnection } ServerPing legacy = result.getResponse(); + + // FlameCord - Close and return if legacy == null + if (legacy == null) { + ch.close(); + return; + } + String kickMessage; if ( v1_5 ) @@ -260,6 +267,17 @@ public class InitialHandler extends PacketHandler implements PendingConnection @Override public void done(ProxyPingEvent pingResult, Throwable error) { + // FlameCord - Close if response is null + if (pingResult.getResponse() == null) { + ch.close(); + return; + } + + // FlameCord - Return if connection is closed + if (ch.isClosed()) { + return; + } + // FlameCord start - 1.7.x support Gson gson = handshake.getProtocolVersion() == ProtocolConstants.MINECRAFT_1_7_2 ? BungeeCord.getInstance().gsonLegacy : BungeeCord.getInstance().gson; if ( ProtocolConstants.isBeforeOrEq( handshake.getProtocolVersion() , ProtocolConstants.MINECRAFT_1_8 ) ) @@ -304,11 +322,13 @@ public class InitialHandler extends PacketHandler implements PendingConnection @Override public void handle(PingPacket ping) throws Exception { - if (!ACCEPT_INVALID_PACKETS) { - Preconditions.checkState(thisState == State.PING, "Not expecting PING"); - } + // FlameCord - Never accept invalid packets + Preconditions.checkState( thisState == State.PING, "Not expecting PING" ); + unsafe.sendPacket( ping ); - disconnect( "" ); + + // FlameCord - Close instead of disconnect + ch.close(); } @Override @@ -617,7 +637,8 @@ public class InitialHandler extends PacketHandler implements PendingConnection { if ( canSendKickMessage() ) { - ch.delayedClose( new Kick( ComponentSerializer.toString( reason ) ) ); + // FlameCord - Changed delayedClose to close + ch.close( new Kick( ComponentSerializer.toString( reason ) ) ); } else { ch.close(); diff --git a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java index 6dc5633f..5c05f2b9 100644 --- a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java +++ b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java @@ -80,40 +80,27 @@ public class ChannelWrapper if ( packet != null && ch.isActive() ) { - ch.writeAndFlush( packet ).addListeners( ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE, ChannelFutureListener.CLOSE ); + // FlameCord - Remove the firing of exceptions on failure + ch.writeAndFlush( packet ).addListeners( ChannelFutureListener.CLOSE ); } else { - ch.flush(); + // FlameCord - Don't flush just close ch.close(); } } } + // FlameCord - Deprecate and "disable" delayedClose because it doesn't have a reason to exist + @Deprecated public void delayedClose(final Kick kick) { - if ( !closing ) - { - closing = true; - - // Minecraft client can take some time to switch protocols. - // Sending the wrong disconnect packet whilst a protocol switch is in progress will crash it. - // Delay 250ms to ensure that the protocol switch (if any) has definitely taken place. - ch.eventLoop().schedule( new Runnable() - { - - @Override - public void run() - { - close( kick ); - } - }, 250, TimeUnit.MILLISECONDS ); - } + close(kick); } public void addBefore(String baseName, String name, ChannelHandler handler) { Preconditions.checkState( ch.eventLoop().inEventLoop(), "cannot add handler outside of event loop" ); - ch.pipeline().flush(); + // FlameCord - Don't flush if not necessary ch.pipeline().addBefore( baseName, name, handler ); } diff --git a/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java b/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java index 96704d5e..654203ab 100644 --- a/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java +++ b/proxy/src/main/java/net/md_5/bungee/netty/PipelineUtils.java @@ -5,6 +5,7 @@ import io.github.waterfallmc.waterfall.event.ConnectionInitEvent; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.Channel; import io.netty.channel.ChannelException; +import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; @@ -102,6 +103,14 @@ public class PipelineUtils BungeeCord.getInstance().getPluginManager().callEvent(connectionInitEvent); } + + // FlameCord - Close on exception caught + @Override + public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) throws Exception { + cause.printStackTrace(); + + ctx.close(); + } }; public static final Base BASE = new Base(); private static final KickStringWriter legacyKicker = new KickStringWriter(); @@ -196,5 +205,13 @@ public class PipelineUtils ch.pipeline().addLast( BOSS_HANDLER, new HandlerBoss() ); } + + // FlameCord - Close on exception caught + @Override + public void exceptionCaught(final ChannelHandlerContext ctx, final Throwable cause) throws Exception { + cause.printStackTrace(); + + ctx.close(); + } } } diff --git a/query/src/main/java/net/md_5/bungee/query/QueryHandler.java b/query/src/main/java/net/md_5/bungee/query/QueryHandler.java index 0c1ecfb8..b3bdfd05 100644 --- a/query/src/main/java/net/md_5/bungee/query/QueryHandler.java +++ b/query/src/main/java/net/md_5/bungee/query/QueryHandler.java @@ -71,6 +71,8 @@ public class QueryHandler extends SimpleChannelInboundHandler if ( in.readUnsignedByte() != 0xFE || in.readUnsignedByte() != 0xFD ) { bungee.getLogger().log( Level.WARNING, "Query - Incorrect magic!: {0}", msg.sender() ); + // FlameCord - Close on incorrect magic + ctx.close(); return; } -- 2.32.0