From 62accc3fa39069e4de51489e2240ce45e021a00b Mon Sep 17 00:00:00 2001 From: Ryan Kurtz Date: Mon, 21 Sep 2026 11:14:39 -0400 Subject: [PATCH] GP-7298: The ProgramLoader and ImportBatchTask now properly validate loader options --- .../app/util/headless/HeadlessAnalyzer.java | 11 +------ .../app/util/importer/ProgramLoader.java | 31 ++++++++++++------- .../java/ghidra/app/util/opinion/Loader.java | 4 +-- .../importer/tasks/ImportBatchTask.java | 13 ++++++-- 4 files changed, 33 insertions(+), 26 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/headless/HeadlessAnalyzer.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/headless/HeadlessAnalyzer.java index c4f196209d..d2c3902b5a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/headless/HeadlessAnalyzer.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/headless/HeadlessAnalyzer.java @@ -1665,16 +1665,7 @@ public class HeadlessAnalyzer { return true; } catch (LoadException e) { - Msg.error(this, "The ProgramLoader could not successfully load " + fsrl + - " with the provided import parameters. Please ensure that any specified" + - " processor/cspec arguments are compatible with the loader that is used during" + - " import and try again."); - if (options.loaderClass != null && options.loaderClass != BinaryLoader.class) { - Msg.error(this, - "NOTE: Import failure may be due to missing opinion for \"" + - options.loaderClass.getSimpleName() + - "\". If so, please contact Ghidra team for assistance."); - } + Msg.error(this, "REPORT: " + e.getMessage()); return false; } catch (Exception e) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/importer/ProgramLoader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/importer/ProgramLoader.java index 5fb0452b59..f51abed8e2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/importer/ProgramLoader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/importer/ProgramLoader.java @@ -629,8 +629,9 @@ public class ProgramLoader { LoadSpec loadSpec = loadSpecChooser.choose(loaderMap); if (loadSpec == null) { String name = Objects.requireNonNullElse(p.getName(), "???"); - Msg.info(ProgramLoader.class, "No load spec found for import file: " + name); - throw new LoadException("No load spec found"); + throw new LoadException( + "No load spec found. Loader/processor/cspec not compatible with import file: " + + name); } return loadSpec; } @@ -642,12 +643,12 @@ public class ProgramLoader { * @param loadSpec The {@link LoadSpec} * @return The {@link Loader} {@link Option}s, with any loader arguments applied * @throws LanguageNotFoundException if there was a problem getting the language - * @throws LoadException if the {@link Loader} had {@code null} options + * @throws LoadException if the {@link Loader} had {@code null} or invalid options */ private List