Fix race condition that could kill connections before they

were initiated
This commit is contained in:
Jonas Konrad 2014-04-25 23:49:04 +02:00 committed by md_5
parent 5d4ed8047a
commit dda042aca8

View File

@ -0,0 +1,63 @@
From 91faf0e210d3dd7664e66dc46aaace12190e5727 Mon Sep 17 00:00:00 2001
From: Jonas Konrad <me@yawk.at>
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 d1b9c49..e9973c2 100644
--- a/src/main/java/net/minecraft/server/NetworkManager.java
+++ b/src/main/java/net/minecraft/server/NetworkManager.java
@@ -42,6 +42,7 @@ public class NetworkManager extends SimpleChannelInboundHandler {
public SocketAddress n;
public java.util.UUID spoofedUUID;
public Property[] spoofedProfile;
+ public boolean preparing = true;
// Spigot End
private PacketListener o;
private EnumProtocol p;
@@ -69,6 +70,9 @@ public class NetworkManager extends SimpleChannelInboundHandler {
super.channelActive(channelhandlercontext);
this.m = channelhandlercontext.channel();
this.n = this.m.remoteAddress();
+ // Spigot Start
+ this.preparing = false;
+ // Spigot End
this.a(EnumProtocol.HANDSHAKING);
}
@@ -187,6 +191,9 @@ public class NetworkManager extends SimpleChannelInboundHandler {
}
public void close(IChatBaseComponent ichatbasecomponent) {
+ // Spigot Start
+ this.preparing = false;
+ // Spigot End
if (this.m.isOpen()) {
this.m.close();
this.q = ichatbasecomponent;
diff --git a/src/main/java/net/minecraft/server/ServerConnection.java b/src/main/java/net/minecraft/server/ServerConnection.java
index 1d7b814..981e22c 100644
--- a/src/main/java/net/minecraft/server/ServerConnection.java
+++ b/src/main/java/net/minecraft/server/ServerConnection.java
@@ -66,6 +66,10 @@ public class ServerConnection {
NetworkManager networkmanager = (NetworkManager) iterator.next();
if (!networkmanager.isConnected()) {
+ // Spigot Start
+ // Fix a race condition where a NetworkManager could be unregistered just before connection.
+ if (networkmanager.preparing) continue;
+ // Spigot End
iterator.remove();
if (networkmanager.f() != null) {
networkmanager.getPacketListener().a(networkmanager.f());
--
1.8.3.2