aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-API-Patches-Unmapped/0205-Prioritise-own-classes-where-possible.patch
diff options
context:
space:
mode:
Diffstat (limited to 'Spigot-API-Patches-Unmapped/0205-Prioritise-own-classes-where-possible.patch')
-rw-r--r--Spigot-API-Patches-Unmapped/0205-Prioritise-own-classes-where-possible.patch80
1 files changed, 80 insertions, 0 deletions
diff --git a/Spigot-API-Patches-Unmapped/0205-Prioritise-own-classes-where-possible.patch b/Spigot-API-Patches-Unmapped/0205-Prioritise-own-classes-where-possible.patch
new file mode 100644
index 0000000000..fad10c31db
--- /dev/null
+++ b/Spigot-API-Patches-Unmapped/0205-Prioritise-own-classes-where-possible.patch
@@ -0,0 +1,80 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Mariell Hoversholm <[email protected]>
+Date: Mon, 27 Apr 2020 12:31:59 +0200
+Subject: [PATCH] Prioritise own classes where possible
+
+This adds the server property `Paper.DisableClassPrioritization` to disable
+prioritization of own classes for plugins' classloaders.
+
+This value is by default not present, and this will therefore break any
+plugins which abuse behaviour related to not using their own classes
+while still loading their own. This is often an issue with failing to
+relocate or shade properly, such as when shading plugin APIs like Vault.
+
+A plugin's classloader will first look in the same jar as it is loading
+in for a requested class, then load it. It does not re-use other
+plugins' classes if it has the chance to avoid doing so.
+
+If a class is not found in the same jar as it is loading for and it does
+find it elsewhere, it will still choose the class elsewhere. This is
+intended behaviour, as it will only prioritise classes it has in its own
+jar, no other plugins' classes will be prioritised in any other order
+than the one they were registered in.
+
+The patch in general terms just loads the class in the plugin's jar
+before it starts looking elsewhere for it.
+
+diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
+index 9d1f7cdf12029c8198792fd299f92be476040222..384edf9890dfbd1cddfdcac4db1ebe9a4d761f78 100644
+--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
++++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java
+@@ -50,6 +50,7 @@ import org.yaml.snakeyaml.error.YAMLException;
+ */
+ public final class JavaPluginLoader implements PluginLoader {
+ final Server server;
++ private static final boolean DISABLE_CLASS_PRIORITIZATION = Boolean.getBoolean("Paper.DisableClassPrioritization"); // Paper
+ private final Pattern[] fileFilters = new Pattern[]{Pattern.compile("\\.jar$")};
+ private final Map<String, Class<?>> classes = new ConcurrentHashMap<String, Class<?>>();
+ private final Map<String, java.util.concurrent.locks.ReentrantReadWriteLock> classLoadLock = new java.util.HashMap<String, java.util.concurrent.locks.ReentrantReadWriteLock>(); // Paper
+@@ -193,6 +194,11 @@ public final class JavaPluginLoader implements PluginLoader {
+
+ @Nullable
+ Class<?> getClassByName(final String name) {
++ // Paper start - prioritize self
++ return getClassByName(name, null);
++ }
++ Class<?> getClassByName(final String name, PluginClassLoader requester) {
++ // Paper end
+ // Paper start - make MT safe
+ Class<?> cachedClass = classes.get(name);
+ if (cachedClass != null) {
+@@ -204,6 +210,16 @@ public final class JavaPluginLoader implements PluginLoader {
+ classLoadLockCount.compute(name, (x, prev) -> prev != null ? prev + 1 : 1);
+ }
+ lock.writeLock().lock();try {
++ // Paper start - prioritize self
++ if (!DISABLE_CLASS_PRIORITIZATION && requester != null) {
++ try {
++ cachedClass = requester.findClass(name, false);
++ } catch (ClassNotFoundException cnfe) {}
++ if (cachedClass != null) {
++ return cachedClass;
++ }
++ }
++ // Paper end-
+ cachedClass = classes.get(name);
+ // Paper end
+
+diff --git a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
+index 3a02dbe9d183bc907dcce081d8338d5716ed5242..28e5c6591fb594ca79ee92480cedc8f549e3fe01 100644
+--- a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
++++ b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java
+@@ -108,7 +108,7 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot
+
+ if (result == null) {
+ if (checkGlobal) {
+- result = loader.getClassByName(name);
++ result = loader.getClassByName(name, this); // Paper - prioritize self
+
+ if (result != null) {
+ PluginDescriptionFile provider = ((PluginClassLoader) result.getClassLoader()).description;