From 86e880d6041d055156ce409d56e8e43637c3f139 Mon Sep 17 00:00:00 2001 From: Jonas Konrad Date: Fri, 25 Apr 2014 23:46:46 +0200 Subject: [PATCH] Fix race condition that could kill connections before they were initiated Because NetworkManagers are registered before they get their channel in channelActive, the ServerConnection would remove them sometimes because it thought they were disconnected. This commit fixes this by introducing a 'preparing' variable that is true while the NetworkManager is not initialized. The ServerConnection does not remove NetworkManagers with this flag. diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java index 30c1e3344..15a686bec 100644 --- a/src/main/java/net/minecraft/server/NetworkManager.java +++ b/src/main/java/net/minecraft/server/NetworkManager.java @@ -51,6 +51,7 @@ public class NetworkManager extends SimpleChannelInboundHandler> { // Spigot Start public java.util.UUID spoofedUUID; public com.mojang.authlib.properties.Property[] spoofedProfile; + public boolean preparing = true; // Spigot End private PacketListener packetListener; private IChatBaseComponent n; @@ -71,6 +72,9 @@ public class NetworkManager extends SimpleChannelInboundHandler> { super.channelActive(channelhandlercontext); this.channel = channelhandlercontext.channel(); this.socketAddress = this.channel.remoteAddress(); + // Spigot Start + this.preparing = false; + // Spigot End try { this.setProtocol(EnumProtocol.HANDSHAKING); @@ -245,6 +249,9 @@ public class NetworkManager extends SimpleChannelInboundHandler> { } public void close(IChatBaseComponent ichatbasecomponent) { + // Spigot Start + this.preparing = false; + // Spigot End if (this.channel.isOpen()) { this.channel.close(); // We can't wait as this may be called from an event loop. this.n = ichatbasecomponent; diff --git a/src/main/java/net/minecraft/server/ServerConnection.java b/src/main/java/net/minecraft/server/ServerConnection.java index 1c0950fd7..ce1229a9d 100644 --- a/src/main/java/net/minecraft/server/ServerConnection.java +++ b/src/main/java/net/minecraft/server/ServerConnection.java @@ -136,6 +136,10 @@ public class ServerConnection { networkmanager.stopReading(); } } else { + // Spigot Start + // Fix a race condition where a NetworkManager could be unregistered just before connection. + if (networkmanager.preparing) continue; + // Spigot End iterator.remove(); networkmanager.handleDisconnection(); } -- 2.19.1