From b2e71dd2425662fba03c0178f62507be449c7aa6 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Thu, 28 May 2026 16:28:59 -0400 Subject: [PATCH] Fixed bug that prevented Ghidra from reopening with an empty project --- .../framework/model/ProjectManager.java | 11 +++---- .../project/DefaultProjectManager.java | 30 ++++++++++++++----- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/model/ProjectManager.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/model/ProjectManager.java index 26befcb7c6..94e52a9d58 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/model/ProjectManager.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/model/ProjectManager.java @@ -78,7 +78,8 @@ public interface ProjectManager { /** * Set the projectLocator of last opened (active) project; this projectLocator is returned * in the getLastOpenedProject() method. - * @param projectLocator project location of last project that was opened + * @param projectLocator project location of last project that was opened. A null value signals + * that the user closed the project. */ public void setLastOpenedProject(ProjectLocator projectLocator); @@ -125,7 +126,7 @@ public interface ProjectManager { public boolean deleteProject(ProjectLocator projectLocator); /** - * Returns true if a project with the given projectLocator exists. + * {@return true if a project with the given projectLocator exists} * @param projectLocator project location */ public boolean projectExists(ProjectLocator projectLocator); @@ -141,13 +142,13 @@ public interface ProjectManager { boolean forceConnect); /** - * Get the information that was last used to access a repository - * managed by a Ghidra server. + * {@return the information that was last used to access a repository managed by a Ghidra + * server} */ public ServerInfo getMostRecentServerInfo(); /** - * Return the user's ToolChest + * {@return the user's ToolChest} */ public ToolChest getUserToolChest(); 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..a5150ce74a 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 @@ -21,6 +21,7 @@ import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -54,6 +55,8 @@ public class DefaultProjectManager implements ProjectManager { private static final String VIEWED_PROJECTS = "ViewedProjects"; private static final String SERVER_INFO = "ServerInfo"; private static final int RECENT_PROJECTS_LIMIT = 6; + + private static final String PROJECT_CLOSED_BY_USER_VALUE = "PROJECT_CLOSED;NO_PROJECT_OPEN"; private static String PROJECT_PATH_SEPARATOR = ";"; private List recentlyOpenedProjectsList; @@ -186,20 +189,26 @@ public class DefaultProjectManager implements ProjectManager { @Override public ProjectLocator getLastOpenedProject() { String projectPath = Preferences.getProperty(LAST_OPENED_PROJECT, null, true); - if (projectPath == null || projectPath.trim().length() == 0) { + if (StringUtils.isBlank(projectPath)) { return null; } + + if (PROJECT_CLOSED_BY_USER_VALUE.equals(projectPath)) { + return null; + } + return getLocatorFromProjectPath(projectPath); } - /** - * Update the last opened project preference. - */ @Override public void setLastOpenedProject(ProjectLocator projectLocator) { - Preferences.setProperty(LAST_OPENED_PROJECT, - projectLocator != null ? projectLocator.toString() : null); + String value = PROJECT_CLOSED_BY_USER_VALUE; + if (projectLocator != null) { + value = projectLocator.toString(); + } + + Preferences.setProperty(LAST_OPENED_PROJECT, value); Preferences.store(); } @@ -576,8 +585,13 @@ public class DefaultProjectManager implements ProjectManager { Preferences.setProperty(SERVER_INFO, serverInfo.getServerName() + ":" + serverInfo.getPortNumber()); } - Preferences.setProperty(LAST_OPENED_PROJECT, - lastOpenedProject != null ? lastOpenedProject.toString() : null); + + String value = PROJECT_CLOSED_BY_USER_VALUE; + if (lastOpenedProject != null) { + value = lastOpenedProject.toString(); + } + Preferences.setProperty(LAST_OPENED_PROJECT, value); + Preferences.store(); }