Waterfall/BungeeCord-Patches/0031-Better-race-condition-...

48 lines
1.8 KiB
Diff

From 851c2b19e31527f7b758f9c924290ad0c950849d Mon Sep 17 00:00:00 2001
From: Tux <write@imaginarycode.com>
Date: Sun, 20 Mar 2016 01:36:23 -0400
Subject: [PATCH] Better race condition check for disconnect()
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 0b1be45..9ced50c 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
@@ -8,6 +8,7 @@ import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.List;
import java.util.UUID;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import javax.crypto.SecretKey;
import com.google.gson.Gson;
@@ -96,12 +97,11 @@ public class InitialHandler extends PacketHandler implements PendingConnection
private boolean legacy;
@Getter
private String extraDataInHandshake = "";
- private boolean disconnecting;
+ private final AtomicBoolean disconnecting = new AtomicBoolean(false);
- @Override
public boolean shouldHandle(PacketWrapper packet) throws Exception
{
- return !disconnecting;
+ return !disconnecting.get();
}
private enum State
@@ -532,9 +532,8 @@ public class InitialHandler extends PacketHandler implements PendingConnection
@Override
public void disconnect(final BaseComponent... reason)
{
- if ( !disconnecting || !ch.isClosed() )
+ if ( disconnecting.compareAndSet(false, true) || !ch.isClosed() )
{
- disconnecting = true;
if ( thisState != State.STATUS && thisState != State.PING ) {
ch.close( new Kick( ComponentSerializer.toString( reason ) ) );
} else {
--
2.8.3