From f5157f12a4ac26a8f55ca50a276b6d457fc150a2 Mon Sep 17 00:00:00 2001 From: BoomEaro <21033866+BoomEaro@users.noreply.github.com> Date: Wed, 1 Nov 2023 21:32:31 +1100 Subject: [PATCH] #3438: Fix possible race condition in duplicate player check --- proxy/src/main/java/net/md_5/bungee/BungeeCord.java | 7 ++++++- proxy/src/main/java/net/md_5/bungee/UserConnection.java | 4 +++- .../java/net/md_5/bungee/connection/InitialHandler.java | 6 +++++- .../java/net/md_5/bungee/connection/UpstreamBridge.java | 1 - 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java index 0bdde1e2..2024149f 100644 --- a/proxy/src/main/java/net/md_5/bungee/BungeeCord.java +++ b/proxy/src/main/java/net/md_5/bungee/BungeeCord.java @@ -753,7 +753,7 @@ public class BungeeCord extends ProxyServer } } - public void addConnection(UserConnection con) + public boolean addConnection(UserConnection con) { UUID offlineId = con.getPendingConnection().getOfflineId(); if ( offlineId != null && offlineId.version() != 3 ) @@ -763,6 +763,10 @@ public class BungeeCord extends ProxyServer connectionLock.writeLock().lock(); try { + if ( connections.containsKey( con.getName() ) || connectionsByUUID.containsKey( con.getUniqueId() ) || connectionsByOfflineUUID.containsKey( offlineId ) ) + { + return false; + } connections.put( con.getName(), con ); connectionsByUUID.put( con.getUniqueId(), con ); connectionsByOfflineUUID.put( offlineId, con ); @@ -770,6 +774,7 @@ public class BungeeCord extends ProxyServer { connectionLock.writeLock().unlock(); } + return true; } public void removeConnection(UserConnection con) 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 18b1690d..04143a46 100644 --- a/proxy/src/main/java/net/md_5/bungee/UserConnection.java +++ b/proxy/src/main/java/net/md_5/bungee/UserConnection.java @@ -153,7 +153,7 @@ public final class UserConnection implements ProxiedPlayer } }; - public void init() + public boolean init() { this.entityRewrite = EntityMap.getEntityMap( getPendingConnection().getVersion() ); @@ -172,6 +172,8 @@ public final class UserConnection implements ProxiedPlayer // Set whether the connection has a 1.8 FML marker in the handshake. forgeClientHandler.setFmlTokenInHandshake( this.getPendingConnection().getExtraDataInHandshake().contains( ForgeConstants.FML_HANDSHAKE_TOKEN ) ); + + return BungeeCord.getInstance().addConnection( this ); } public void sendPacket(PacketWrapper packet) 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 18570a7a..b1b087aa 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 @@ -613,7 +613,11 @@ public class InitialHandler extends PacketHandler implements PendingConnection private void finish2() { - userCon.init(); + if ( !userCon.init() ) + { + disconnect( bungee.getTranslation( "already_connected_proxy" ) ); + return; + } ch.getHandle().pipeline().get( HandlerBoss.class ).setHandler( new UpstreamBridge( bungee, userCon ) ); bungee.getPluginManager().callEvent( new PostLoginEvent( userCon ) ); diff --git a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java index 4b2e6269..460aa491 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/UpstreamBridge.java @@ -54,7 +54,6 @@ public class UpstreamBridge extends PacketHandler this.bungee = bungee; this.con = con; - BungeeCord.getInstance().addConnection( con ); con.getTabListHandler().onConnect(); }