13
0
geforkt von Mirrors/Paper
Paper/CraftBukkit-Patches/0113-Fix-race-condition-that-could-kill-connections-befor.patch

64 Zeilen
2.8 KiB
Diff

2015-06-01 11:22:52 +02:00
From 5d56c6de0519ca6a91ff18eb341aa3d276b07ec9 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
2015-05-09 22:23:26 +02:00
index 27f1d0a..8430a46 100644
--- a/src/main/java/net/minecraft/server/NetworkManager.java
+++ b/src/main/java/net/minecraft/server/NetworkManager.java
2015-02-28 12:36:22 +01:00
@@ -68,6 +68,7 @@ public class NetworkManager extends SimpleChannelInboundHandler<Packet> {
public SocketAddress l;
public java.util.UUID spoofedUUID;
2014-11-28 02:17:45 +01:00
public com.mojang.authlib.properties.Property[] spoofedProfile;
+ public boolean preparing = true;
// Spigot End
2015-02-28 12:36:22 +01:00
private PacketListener m;
private IChatBaseComponent n;
@@ -82,6 +83,9 @@ public class NetworkManager extends SimpleChannelInboundHandler<Packet> {
super.channelActive(channelhandlercontext);
2015-05-09 22:23:26 +02:00
this.channel = channelhandlercontext.channel();
this.l = this.channel.remoteAddress();
+ // Spigot Start
+ this.preparing = false;
+ // Spigot End
2014-11-28 02:17:45 +01:00
try {
this.a(EnumProtocol.HANDSHAKING);
2015-02-28 12:36:22 +01:00
@@ -235,6 +239,9 @@ public class NetworkManager extends SimpleChannelInboundHandler<Packet> {
}
public void close(IChatBaseComponent ichatbasecomponent) {
+ // Spigot Start
+ this.preparing = false;
+ // Spigot End
2015-05-09 22:23:26 +02:00
if (this.channel.isOpen()) {
this.channel.close(); // We can't wait as this may be called from an event loop.
2015-02-28 12:36:22 +01:00
this.n = ichatbasecomponent;
diff --git a/src/main/java/net/minecraft/server/ServerConnection.java b/src/main/java/net/minecraft/server/ServerConnection.java
2015-05-25 14:05:40 +02:00
index cfd4ca1..f13182c 100644
--- a/src/main/java/net/minecraft/server/ServerConnection.java
+++ b/src/main/java/net/minecraft/server/ServerConnection.java
2015-02-28 12:36:22 +01:00
@@ -137,6 +137,10 @@ public class ServerConnection {
2014-11-28 02:17:45 +01:00
if (!networkmanager.h()) {
if (!networkmanager.g()) {
+ // Spigot Start
+ // Fix a race condition where a NetworkManager could be unregistered just before connection.
+ if (networkmanager.preparing) continue;
+ // Spigot End
iterator.remove();
networkmanager.l();
} else {
--
2015-05-09 22:23:26 +02:00
2.1.4