From 2483eacff5cd72e53fa0abe6aa67a9a40197c5c9 Mon Sep 17 00:00:00 2001 From: Pierre Maurice Schwang Date: Wed, 6 Apr 2022 16:22:53 +0200 Subject: [PATCH] Fix memory leak by Citizen NPCs (#1693) * fix: ignore uuid v2 for BukkitPermissionAttachmentManager Fixes a memory leak that attaches and caches PermissionAttachments to NPCs. Citiziens uses version 2 UUIDs, which are not used for regular player uuids. Those v2 uuids are now excluded. * fix: create Permission when required * fix: use citizens documented way to check for NPCs --- .../bukkit/BukkitPermissionAttachmentManager.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java index 651c56217..8c065b9ac 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/BukkitPermissionAttachmentManager.java @@ -2,6 +2,7 @@ package com.fastasyncworldedit.bukkit; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import org.bukkit.entity.Player; +import org.bukkit.permissions.PermissibleBase; import org.bukkit.permissions.PermissionAttachment; import javax.annotation.Nullable; @@ -12,6 +13,7 @@ public class BukkitPermissionAttachmentManager { private final WorldEditPlugin plugin; private final Map attachments = new ConcurrentHashMap<>(); + private PermissionAttachment noopAttachment; public BukkitPermissionAttachmentManager(WorldEditPlugin plugin) { this.plugin = plugin; @@ -21,6 +23,12 @@ public class BukkitPermissionAttachmentManager { if (p == null) { return null; } + if (p.hasMetadata("NPC")) { + if (this.noopAttachment == null) { + this.noopAttachment = new PermissionAttachment(plugin, new PermissibleBase(null)); + } + return noopAttachment; + } return attachments.computeIfAbsent(p, k -> k.addAttachment(plugin)); } @@ -28,6 +36,10 @@ public class BukkitPermissionAttachmentManager { if (p == null) { return; } + if (p.hasMetadata("NPC") && noopAttachment != null) { + p.removeAttachment(noopAttachment); + return; + } PermissionAttachment attach = attachments.remove(p); if (attach != null) { p.removeAttachment(attach);