From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Aikar Date: Sat, 11 Jul 2020 03:54:28 -0400 Subject: [PATCH] Thread Safe Vanilla Command permission checking Datapacks check this on load and are built concurrently. This was breaking them badly due to race conditions. Plus, .canUse we want to be safe for async anyways. diff --git a/src/main/java/com/mojang/brigadier/tree/CommandNode.java b/src/main/java/com/mojang/brigadier/tree/CommandNode.java index 3384501f83d445f45aa8233e98c7597daa67b8ef..bd12d372a04172504b3664a8136e534ca1b1712d 100644 --- a/src/main/java/com/mojang/brigadier/tree/CommandNode.java +++ b/src/main/java/com/mojang/brigadier/tree/CommandNode.java @@ -75,10 +75,10 @@ public abstract class CommandNode implements Comparable> { public synchronized boolean canUse(final S source) { if (source instanceof CommandSourceStack) { try { - ((CommandSourceStack) source).currentCommand = this; + ((CommandSourceStack) source).currentCommand.put(Thread.currentThread(), this); // Paper - Thread Safe Vanilla Command permission checking return this.requirement.test(source); } finally { - ((CommandSourceStack) source).currentCommand = null; + ((CommandSourceStack) source).currentCommand.remove(Thread.currentThread()); // Paper - Thread Safe Vanilla Command permission checking } } // CraftBukkit end diff --git a/src/main/java/net/minecraft/commands/CommandSourceStack.java b/src/main/java/net/minecraft/commands/CommandSourceStack.java index c772fa3b7a1276b0b41c45c6e0f5584b9c3a90cd..55c394fb00d0c7caee3a06720c37f04db571fe93 100644 --- a/src/main/java/net/minecraft/commands/CommandSourceStack.java +++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java @@ -64,7 +64,7 @@ public class CommandSourceStack implements ExecutionCommandSource currentCommand = new java.util.concurrent.ConcurrentHashMap<>(); // CraftBukkit // Paper - Thread Safe Vanilla Command permission checking public boolean bypassSelectorPermissions = false; // Paper - add bypass for selector permissions public CommandSourceStack(CommandSource output, Vec3 pos, Vec2 rot, ServerLevel world, int level, String name, Component displayName, MinecraftServer server, @Nullable Entity entity) { @@ -193,9 +193,11 @@ public class CommandSourceStack implements ExecutionCommandSource