From af389d7abcdd1912cda17d24a665b038d33f456a Mon Sep 17 00:00:00 2001 From: Ryan Kurtz Date: Fri, 5 Jun 2026 06:24:49 -0400 Subject: [PATCH] GP-6925: Fixing one-shot analysisEnded() issue --- .../core/analysis/AutoAnalysisManager.java | 1 + .../core/analysis/AutoAnalysisPlugin.java | 7 ++++--- .../core/analysis/OneShotAnalysisCommand.java | 18 +++++++++++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AutoAnalysisManager.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AutoAnalysisManager.java index cfe711893e..1f06878cc5 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AutoAnalysisManager.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AutoAnalysisManager.java @@ -232,6 +232,7 @@ public class AutoAnalysisManager { analyzer.optionsChanged(options.getOptions(analyzer.getName()), getProgram()); OneShotAnalysisCommand cmd = new OneShotAnalysisCommand(analyzer, set, log); + addListener(cmd); schedule(cmd, analyzer.getPriority().priority()); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AutoAnalysisPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AutoAnalysisPlugin.java index 9d34be95ae..b18f3bc087 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AutoAnalysisPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AutoAnalysisPlugin.java @@ -360,9 +360,10 @@ public class AutoAnalysisPlugin extends Plugin implements AutoAnalysisManagerLis options = options.getOptions(analyzer.getName()); analyzer.optionsChanged(options, program); - analysisMgr.schedule( - new OneShotAnalysisCommand(analyzer, set, analysisMgr.getMessageLog()), - analyzer.getPriority().priority()); + OneShotAnalysisCommand cmd = + new OneShotAnalysisCommand(analyzer, set, analysisMgr.getMessageLog()); + analysisMgr.addListener(cmd); + analysisMgr.schedule(cmd, analyzer.getPriority().priority()); tool.setStatusInfo("Analysis scheduled: " + analyzer.getName()); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/OneShotAnalysisCommand.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/OneShotAnalysisCommand.java index fc439e5369..0efdfff02d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/OneShotAnalysisCommand.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/OneShotAnalysisCommand.java @@ -4,9 +4,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -27,11 +27,14 @@ import ghidra.util.task.TaskMonitor; * Background task to artificially kick off Auto analysis by * calling anything that analyzes bytes. */ -public class OneShotAnalysisCommand extends BackgroundCommand { +public class OneShotAnalysisCommand extends BackgroundCommand + implements AutoAnalysisManagerListener { private Analyzer analyzer; private AddressSetView set; private MessageLog log; + private Program lastProgram; + public OneShotAnalysisCommand(Analyzer analyzer, AddressSetView set, MessageLog log) { super(analyzer.getName() + " - One Time", true, true, false); this.analyzer = analyzer; @@ -41,6 +44,7 @@ public class OneShotAnalysisCommand extends BackgroundCommand { @Override public boolean applyTo(Program program, TaskMonitor monitor) { + this.lastProgram = program; try { monitor.setMessage(analyzer.getName()); return analyzer.added(program, set, monitor, log); @@ -50,6 +54,13 @@ public class OneShotAnalysisCommand extends BackgroundCommand { } } + @Override + public void analysisEnded(AutoAnalysisManager manager, boolean isCancelled) { + if (lastProgram != null) { + analyzer.analysisEnded(lastProgram); + } + } + @Override public String getStatusMsg() { String statusMessage = log.getStatus(); @@ -60,4 +71,5 @@ public class OneShotAnalysisCommand extends BackgroundCommand { return null; } + }