From 55941791e10363558be365954215217eb6c6734f Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 1 Sep 2016 09:07:32 +1000 Subject: SPIGOT-2645: Better PluginClassLoader safety --- .../org/bukkit/plugin/java/JavaPluginLoader.java | 35 +++++++++++----------- 1 file changed, 17 insertions(+), 18 deletions(-) (limited to 'src/main/java/org') diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java index 3bacd09c..df613b0c 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java @@ -7,12 +7,12 @@ import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.logging.Level; @@ -49,7 +49,7 @@ public final class JavaPluginLoader implements PluginLoader { final Server server; private final Pattern[] fileFilters = new Pattern[] { Pattern.compile("\\.jar$"), }; private final Map> classes = new HashMap>(); - private final Map loaders = Collections.synchronizedMap(new LinkedHashMap()); + private final List loaders = new CopyOnWriteArrayList(); /** * This class was not meant to be constructed explicitly @@ -115,7 +115,7 @@ public final class JavaPluginLoader implements PluginLoader { } for (final String pluginName : description.getDepend()) { - PluginClassLoader current = loaders.get(pluginName); + Plugin current = server.getPluginManager().getPlugin(pluginName); if (current == null) { throw new UnknownDependencyException(pluginName); @@ -131,7 +131,7 @@ public final class JavaPluginLoader implements PluginLoader { throw new InvalidPluginException(ex); } - loaders.put(description.getName(), loader); + loaders.add(loader); return loader.plugin; } @@ -184,14 +184,12 @@ public final class JavaPluginLoader implements PluginLoader { if (cachedClass != null) { return cachedClass; } else { - synchronized (loaders) { - for (PluginClassLoader loader : loaders.values()) { - try { - cachedClass = loader.findClass(name, false); - } catch (ClassNotFoundException cnfe) {} - if (cachedClass != null) { - return cachedClass; - } + for (PluginClassLoader loader : loaders) { + try { + cachedClass = loader.findClass(name, false); + } catch (ClassNotFoundException cnfe) {} + if (cachedClass != null) { + return cachedClass; } } } @@ -320,10 +318,11 @@ public final class JavaPluginLoader implements PluginLoader { JavaPlugin jPlugin = (JavaPlugin) plugin; - String pluginName = jPlugin.getDescription().getName(); + PluginClassLoader pluginLoader = (PluginClassLoader) jPlugin.getClassLoader(); - if (!loaders.containsKey(pluginName)) { - loaders.put(pluginName, (PluginClassLoader) jPlugin.getClassLoader()); + if (!loaders.contains(pluginLoader)) { + loaders.add(pluginLoader); + server.getLogger().log(Level.WARNING, "Enabled plugin with unregistered PluginClassLoader " + plugin.getDescription().getFullName()); } try { @@ -356,10 +355,10 @@ public final class JavaPluginLoader implements PluginLoader { server.getLogger().log(Level.SEVERE, "Error occurred while disabling " + plugin.getDescription().getFullName() + " (Is it up to date?)", ex); } - loaders.remove(jPlugin.getDescription().getName()); - if (cloader instanceof PluginClassLoader) { PluginClassLoader loader = (PluginClassLoader) cloader; + loaders.remove(loader); + Set names = loader.getClasses(); for (String name : names) { -- cgit v1.2.3