From 4b379d3af3d8b45022e5d3198d5557365c49f6f2 Mon Sep 17 00:00:00 2001 From: Joshua Villalta <93329405+vgoat21@users.noreply.github.com> Date: Mon, 6 Jul 2026 19:01:18 +0100 Subject: [PATCH] fix: detach analysis unable to find bookmark --- .../core/services/api/GhidraRevengService.java | 5 ++++- .../ai/reveng/DetachProgramAssociationTest.java | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/test/java/ai/reveng/DetachProgramAssociationTest.java diff --git a/src/main/java/ai/reveng/toolkit/ghidra/core/services/api/GhidraRevengService.java b/src/main/java/ai/reveng/toolkit/ghidra/core/services/api/GhidraRevengService.java index 3ebc37d..f8e4215 100644 --- a/src/main/java/ai/reveng/toolkit/ghidra/core/services/api/GhidraRevengService.java +++ b/src/main/java/ai/reveng/toolkit/ghidra/core/services/api/GhidraRevengService.java @@ -556,7 +556,10 @@ public void removeProgramAssociation(Program program){ program.getUsrPropertyManager().removePropertyMap(REAI_FUNCTION_PROP_MAP); program.getUsrPropertyManager().removePropertyMap(REAI_FUNCTION_MANGLED_MAP); - program.getBookmarkManager().removeBookmarks(REVENG_BOOKMARK_TYPE); + var bookmarkManager = program.getBookmarkManager(); + if (bookmarkManager.getBookmarkType(REVENG_BOOKMARK_TYPE) != null) { + bookmarkManager.removeBookmarks(REVENG_BOOKMARK_TYPE); + } var revengTag = program.getFunctionManager().getFunctionTagManager().getFunctionTag(REVENGAI_FUNCTION_TAG); if (revengTag != null) { revengTag.delete(); diff --git a/src/test/java/ai/reveng/DetachProgramAssociationTest.java b/src/test/java/ai/reveng/DetachProgramAssociationTest.java new file mode 100644 index 0000000..073b452 --- /dev/null +++ b/src/test/java/ai/reveng/DetachProgramAssociationTest.java @@ -0,0 +1,17 @@ +package ai.reveng; + +import ai.reveng.toolkit.ghidra.core.services.api.mocks.UnimplementedAPI; +import ghidra.program.database.ProgramBuilder; +import org.junit.Test; + +public class DetachProgramAssociationTest extends RevEngMockableHeadedIntegrationTest { + + @Test + public void testDetachWithoutMarkedFunctions() throws Exception { + var service = addMockedService(env.getTool(), new UnimplementedAPI()); + var builder = new ProgramBuilder("detach-test", ProgramBuilder._X64, this); + var program = builder.getProgram(); + + program.withTransaction("Undo binary association", () -> service.removeProgramAssociation(program)); + } +}