From e7679a870033439de9244c2f4b3dfa7bd045f1c2 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Thu, 13 Feb 2020 09:55:19 -0700 Subject: [PATCH] PluginManager: try/catch Throwable all the plugin startup stuff If you loaded an external plugin that throws LinkageErrors it could cause the client not to start --- .../ExternalPluginManager.java | 6 ++- .../client/plugins/PluginManager.java | 53 ++++++++++++++----- 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginManager.java b/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginManager.java index 2a3c3a828c..197eb31a53 100644 --- a/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginManager.java @@ -305,7 +305,11 @@ public class ExternalPluginManager }); } } - catch (Exception e) + catch (ThreadDeath e) + { + throw e; + } + catch (Throwable e) { log.warn("Unable to start or load external plugin \"{}\"", manifest.getInternalName(), e); if (newPlugins != null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java index ed814d27cb..5dd3c6b231 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/PluginManager.java @@ -160,17 +160,27 @@ public class PluginManager public Config getPluginConfigProxy(Plugin plugin) { - final Injector injector = plugin.getInjector(); - - for (Key key : injector.getAllBindings().keySet()) + try { - Class type = key.getTypeLiteral().getRawType(); - if (Config.class.isAssignableFrom(type)) + final Injector injector = plugin.getInjector(); + + for (Key key : injector.getAllBindings().keySet()) { - return (Config) injector.getInstance(key); + Class type = key.getTypeLiteral().getRawType(); + if (Config.class.isAssignableFrom(type)) + { + return (Config) injector.getInstance(key); + } } } - + catch (ThreadDeath e) + { + throw e; + } + catch (Throwable e) + { + log.warn("Unable to get plugin config", e); + } return null; } @@ -203,9 +213,20 @@ public class PluginManager public void loadDefaultPluginConfiguration(Collection plugins) { - for (Object config : getPluginConfigProxies(plugins)) + try { - configManager.setDefaultConfiguration(config, false); + for (Object config : getPluginConfigProxies(plugins)) + { + configManager.setDefaultConfiguration(config, false); + } + } + catch (ThreadDeath e) + { + throw e; + } + catch (Throwable ex) + { + log.warn("Unable to reset plugin configuration", ex); } } @@ -367,7 +388,11 @@ public class PluginManager schedule(plugin); eventBus.post(new PluginChanged(plugin, true)); } - catch (Exception ex) + catch (ThreadDeath e) + { + throw e; + } + catch (Throwable ex) { throw new PluginInstantiationException(ex); } @@ -440,9 +465,13 @@ public class PluginManager Plugin plugin; try { - plugin = clazz.newInstance(); + plugin = clazz.getDeclaredConstructor().newInstance(); } - catch (InstantiationException | IllegalAccessException ex) + catch (ThreadDeath e) + { + throw e; + } + catch (Throwable ex) { throw new PluginInstantiationException(ex); }