From e8e30d245e173dd4cca7753dee6d50126623ad6f Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Wed, 13 May 2026 17:41:09 -0400 Subject: [PATCH] Fixed class loading for wrapped option --- .../framework/options/WrappedCustomOption.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Ghidra/Framework/Gui/src/main/java/ghidra/framework/options/WrappedCustomOption.java b/Ghidra/Framework/Gui/src/main/java/ghidra/framework/options/WrappedCustomOption.java index 79e982438d..f6f155ca12 100644 --- a/Ghidra/Framework/Gui/src/main/java/ghidra/framework/options/WrappedCustomOption.java +++ b/Ghidra/Framework/Gui/src/main/java/ghidra/framework/options/WrappedCustomOption.java @@ -33,20 +33,28 @@ public class WrappedCustomOption implements WrappedOption { @Override public void readState(SaveState saveState) { - String customOptionClassName = saveState.getString("CUSTOM OPTION CLASS", null); + String className = saveState.getString("CUSTOM OPTION CLASS", null); valid = false; try { - Class c = Class.forName(customOptionClassName); - value = (CustomOption) c.getConstructor().newInstance(); + + ClassLoader loader = getClass().getClassLoader(); + Class clazz = Class.forName(className, false, loader); + if (!CustomOption.class.isAssignableFrom(clazz)) { + Msg.error(this, "Can't create custom option instance; not a CustomOpiton: " + + className); + return; + } + + value = (CustomOption) clazz.getConstructor().newInstance(); value.readState(saveState); valid = true; } catch (ClassNotFoundException e) { Msg.info(this, - "Custom option class '%s' does not exist".formatted(customOptionClassName)); + "Custom option class '%s' does not exist".formatted(className)); } catch (Exception e) { - Msg.error(this, "Can't create customOption instance for: " + customOptionClassName, e); + Msg.error(this, "Can't create custom option instance for: " + className, e); } }