From fd69f74b22fce7ef8961772a3f31c6bb07c22957 Mon Sep 17 00:00:00 2001 From: Frank van der Heijden Date: Wed, 4 Aug 2021 20:17:03 +0200 Subject: [PATCH] Set libraryLoader to null & clear classes in PluginClassLoader (bukkit) --- .../bukkit/managers/BukkitPluginManager.java | 3 +- .../bukkit/reflection/RJavaPlugin.java | 6 +--- .../bukkit/reflection/RPluginClassLoader.java | 28 +++++++++++++------ .../common}/utils/ReflectionUtils.java | 2 +- .../reflection/RVelocityCommandManager.java | 2 +- 5 files changed, 23 insertions(+), 18 deletions(-) rename {Velocity/src/main/java/net/frankheijden/serverutils/velocity => Common/src/main/java/net/frankheijden/serverutils/common}/utils/ReflectionUtils.java (95%) diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java index 55ddea6..8bbaf12 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java @@ -146,12 +146,11 @@ public class BukkitPluginManager extends AbstractPluginManager> classes = RPluginClassLoader.getClasses(classLoader); RJavaPluginLoader.removeClasses(loader, classes.keySet()); + RPluginClassLoader.clearClassLoader(classLoader); RJavaPlugin.clearJavaPlugin(plugin); addIfInstance(closeables, RPluginClassLoader.getLibraryLoader(classLoader)); diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RJavaPlugin.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RJavaPlugin.java index 89541ee..57be5db 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RJavaPlugin.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RJavaPlugin.java @@ -1,7 +1,6 @@ package net.frankheijden.serverutils.bukkit.reflection; import dev.frankheijden.minecraftreflection.MinecraftReflection; -import java.io.Closeable; import java.io.File; import org.bukkit.plugin.java.JavaPlugin; @@ -23,12 +22,9 @@ public class RJavaPlugin { /** * Clears the JavaPlugin from instances and returns the classloader associated with it. - * @param instance The instance of the JavaPlugin. - * @return The classloader associated with it. */ - public static Closeable clearJavaPlugin(Object instance) { + public static void clearJavaPlugin(Object instance) { reflection.set(instance, "loader", null); reflection.set(instance, "classLoader", null); - return null; } } diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RPluginClassLoader.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RPluginClassLoader.java index f5c8f6c..7d1c28b 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RPluginClassLoader.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/reflection/RPluginClassLoader.java @@ -1,8 +1,11 @@ package net.frankheijden.serverutils.bukkit.reflection; +import java.lang.reflect.Field; +import java.util.Map; import dev.frankheijden.minecraftreflection.MinecraftReflection; import dev.frankheijden.minecraftreflection.MinecraftReflectionVersion; -import java.util.Map; +import dev.frankheijden.minecraftreflection.Reflection; +import net.frankheijden.serverutils.common.utils.ReflectionUtils; import org.bukkit.plugin.PluginLoader; public class RPluginClassLoader { @@ -31,22 +34,29 @@ public class RPluginClassLoader { } public static ClassLoader getLibraryLoader(ClassLoader loader) { - if (loader == null && MinecraftReflectionVersion.MINOR <= 16) return null; + if (loader == null || MinecraftReflectionVersion.MINOR <= 16) return null; return reflection.get(loader, "libraryLoader"); } /** * Clears the plugin fields from the specified PluginClassLoader. - * @param pluginLoader The plugin loader instance. */ - public static void clearPluginClassLoader(Object pluginLoader) { - if (pluginLoader == null) return; + public static void clearPluginClassLoader(Object classLoader) { + if (classLoader == null) return; - reflection.set(pluginLoader, "plugin", null); - reflection.set(pluginLoader, "pluginInit", null); + reflection.set(classLoader, "loader", null); + if (MinecraftReflectionVersion.MINOR > 16) { + ReflectionUtils.doPrivilegedWithUnsafe(unsafe -> { + Field libraryLoaderField = Reflection.getField(reflection.getClazz(), "libraryLoader"); + unsafe.putObject(classLoader, unsafe.objectFieldOffset(libraryLoaderField), null); + }); + } + reflection.set(classLoader, "plugin", null); + reflection.set(classLoader, "pluginInit", null); + getClasses(classLoader).clear(); } - public static Map> getClasses(Object pluginLoader) { - return reflection.get(pluginLoader, "classes"); + public static Map> getClasses(Object classLoader) { + return reflection.get(classLoader, "classes"); } } diff --git a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/utils/ReflectionUtils.java b/Common/src/main/java/net/frankheijden/serverutils/common/utils/ReflectionUtils.java similarity index 95% rename from Velocity/src/main/java/net/frankheijden/serverutils/velocity/utils/ReflectionUtils.java rename to Common/src/main/java/net/frankheijden/serverutils/common/utils/ReflectionUtils.java index 99c779c..b1ab953 100644 --- a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/utils/ReflectionUtils.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/utils/ReflectionUtils.java @@ -1,4 +1,4 @@ -package net.frankheijden.serverutils.velocity.utils; +package net.frankheijden.serverutils.common.utils; import dev.frankheijden.minecraftreflection.Reflection; import java.lang.invoke.MethodHandle; diff --git a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/reflection/RVelocityCommandManager.java b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/reflection/RVelocityCommandManager.java index 4926a74..0ffa6ea 100644 --- a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/reflection/RVelocityCommandManager.java +++ b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/reflection/RVelocityCommandManager.java @@ -15,8 +15,8 @@ import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; +import net.frankheijden.serverutils.common.utils.ReflectionUtils; import net.frankheijden.serverutils.velocity.ServerUtils; -import net.frankheijden.serverutils.velocity.utils.ReflectionUtils; public class RVelocityCommandManager {