2021-06-11 14:02:28 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Aikar <aikar@aikar.co>
|
|
|
|
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
|
2021-06-14 11:46:59 +02:00
|
|
|
index aa3a1795850a419f624f14bd7c4daab0020779d0..39708be1b445791b053023dec16ad7d4efcc9048 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/com/mojang/brigadier/tree/CommandNode.java
|
|
|
|
+++ b/src/main/java/com/mojang/brigadier/tree/CommandNode.java
|
|
|
|
@@ -74,10 +74,10 @@ public abstract class CommandNode<S> implements Comparable<CommandNode<S>> {
|
|
|
|
public synchronized boolean canUse(final S source) {
|
|
|
|
if (source instanceof CommandSourceStack) {
|
|
|
|
try {
|
|
|
|
- ((CommandSourceStack) source).currentCommand = this;
|
|
|
|
+ ((CommandSourceStack) source).currentCommand.set(this); // Paper
|
2021-06-14 11:46:59 +02:00
|
|
|
return this.requirement.test(source);
|
2021-06-11 14:02:28 +02:00
|
|
|
} finally {
|
|
|
|
- ((CommandSourceStack) source).currentCommand = null;
|
|
|
|
+ ((CommandSourceStack) source).currentCommand.set(null); // Paper
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// CraftBukkit end
|
|
|
|
diff --git a/src/main/java/net/minecraft/commands/CommandSourceStack.java b/src/main/java/net/minecraft/commands/CommandSourceStack.java
|
2021-07-07 08:52:40 +02:00
|
|
|
index a59d14e61fcbca7861a5593d0717b81262ccbdc5..134bb2a4826419110c10a483834747b942576e58 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/commands/CommandSourceStack.java
|
|
|
|
+++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java
|
|
|
|
@@ -54,7 +54,7 @@ public class CommandSourceStack implements SharedSuggestionProvider, com.destroy
|
|
|
|
private final ResultConsumer<CommandSourceStack> consumer;
|
|
|
|
private final EntityAnchorArgument.Anchor anchor;
|
|
|
|
private final Vec2 rotation;
|
|
|
|
- public volatile CommandNode currentCommand; // CraftBukkit
|
|
|
|
+ public ThreadLocal<CommandNode> currentCommand = new ThreadLocal<>(); // CraftBukkit // Paper
|
|
|
|
|
2021-07-07 08:52:40 +02:00
|
|
|
public CommandSourceStack(CommandSource output, Vec3 pos, Vec2 rot, ServerLevel world, int level, String name, Component displayName, MinecraftServer server, @Nullable Entity entity) {
|
|
|
|
this(output, pos, rot, world, level, name, displayName, server, entity, false, (commandcontext, flag, j) -> {
|
2021-06-14 11:46:59 +02:00
|
|
|
@@ -175,9 +175,11 @@ public class CommandSourceStack implements SharedSuggestionProvider, com.destroy
|
2021-06-11 14:02:28 +02:00
|
|
|
@Override
|
|
|
|
public boolean hasPermission(int level) {
|
|
|
|
// CraftBukkit start
|
|
|
|
- CommandNode currentCommand = this.currentCommand;
|
|
|
|
+ // Paper start - fix concurrency issue
|
|
|
|
+ CommandNode currentCommand = this.currentCommand.get();
|
|
|
|
if (currentCommand != null) {
|
2021-06-14 11:46:59 +02:00
|
|
|
return this.hasPermission(level, org.bukkit.craftbukkit.command.VanillaCommandWrapper.getPermission(currentCommand));
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
// CraftBukkit end
|
|
|
|
|