From a16770a969bc90bb171ab11e68b7d88f3118418f Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Mon, 27 Jul 2026 14:40:39 -0400 Subject: [PATCH] GP-7096 - Prevent headless analyzer from updating last opened project --- .../app/util/headless/HeadlessAnalyzer.java | 22 ++++++++++++++++++- .../framework/model/DefaultLaunchMode.java | 14 ++++++------ .../project/DefaultProjectManager.java | 2 +- 3 files changed, 29 insertions(+), 9 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 8048bacdbd..7c8552d664 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 @@ -1859,7 +1859,27 @@ public class HeadlessAnalyzer { } } + /** + * A headless version of the {@link DefaultProjectManager} that does not update the project's + * preferences. This prevents the headless environment from overwriting settings GUI + * installations. + */ private static class HeadlessGhidraProjectManager extends DefaultProjectManager { - // this exists just to allow access to the constructor + + @Override + public void setLastOpenedProject(ProjectLocator projectLocator) { + // No need to save this for headless. We also do not want to affect the GUI by saving + // this value. + } + + @Override + public ProjectLocator getLastOpenedProject() { + return null; + } + + @Override + protected void updatePreferences() { + // nothing to save + } } } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/model/DefaultLaunchMode.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/model/DefaultLaunchMode.java index f8cbbc1884..3a0ced246c 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/model/DefaultLaunchMode.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/model/DefaultLaunchMode.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. @@ -23,20 +23,20 @@ import ghidra.framework.options.Options; */ public enum DefaultLaunchMode { - REUSE_TOOL("Reuse acceptable running tool"), - NEW_TOOL("Launch new default tool"); + REUSE_TOOL("Reuse Tool"), + NEW_TOOL("New Tool"); public static DefaultLaunchMode DEFAULT = NEW_TOOL; - private String str; + private String description; private DefaultLaunchMode(String str) { - this.str = str; + this.description = str; } @Override public String toString() { - return str; + return description; } } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/DefaultProjectManager.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/DefaultProjectManager.java index 5a8071f01a..fdee732bb2 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/DefaultProjectManager.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/DefaultProjectManager.java @@ -568,7 +568,7 @@ public class DefaultProjectManager implements ProjectManager { /** * Update preferences file with list of known projects. */ - void updatePreferences() { + protected void updatePreferences() { setProjectLocatorProperty(recentlyOpenedProjectsList, RECENT_PROJECTS); setProjectURLProperty(recentlyViewedProjectsList, VIEWED_PROJECTS);