From 5be1971ecf942ea997bcd62024cecedec1ae2278 Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Tue, 3 May 2022 09:40:22 -0400 Subject: [PATCH] GP-1949 corrected memory map cache update for block removals --- .../ghidra/program/database/mem/MemoryBlockDB.java | 4 ++-- .../program/database/mem/MemoryMapDBAdapter.java | 4 ++-- .../program/database/mem/MemoryMapDBAdapterV0.java | 2 +- .../program/database/mem/MemoryMapDBAdapterV2.java | 2 +- .../program/database/mem/MemoryMapDBAdapterV3.java | 13 +++++++++++-- 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryBlockDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryBlockDB.java index 0fef32edca..ecb8e34565 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryBlockDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryBlockDB.java @@ -571,7 +571,7 @@ public class MemoryBlockDB implements MemoryBlock { for (SubMemoryBlock subBlock : subBlocks) { subBlock.delete(); } - adapter.deleteMemoryBlock(getID()); + adapter.deleteMemoryBlock(this); invalidate(); } @@ -670,7 +670,7 @@ public class MemoryBlockDB implements MemoryBlock { subBlocks.addAll(memBlock2.subBlocks); possiblyMergeSubBlocks(n - 1, n); sequenceSubBlocks(); - adapter.deleteMemoryBlock(memBlock2.id); + adapter.deleteMemoryBlock(memBlock2); adapter.updateBlockRecord(record); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapter.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapter.java index 24944c33d9..c9ade852fe 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapter.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapter.java @@ -228,10 +228,10 @@ abstract class MemoryMapDBAdapter { /** * Deletes the given memory block. - * @param key the key for the memory block record + * @param block the memory block to be deleted * @throws IOException if a database IO error occurs. */ - abstract void deleteMemoryBlock(long key) throws IOException; + abstract void deleteMemoryBlock(MemoryBlockDB block) throws IOException; /** * Updates the memory block record. diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapterV0.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapterV0.java index fcb4fd7ef9..e79b4085ac 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapterV0.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapterV0.java @@ -210,7 +210,7 @@ class MemoryMapDBAdapterV0 extends MemoryMapDBAdapter { } @Override - void deleteMemoryBlock(long key) throws IOException { + void deleteMemoryBlock(MemoryBlockDB block) throws IOException { throw new UnsupportedOperationException(); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapterV2.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapterV2.java index 0a00e4912c..2c9425fc04 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapterV2.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapterV2.java @@ -169,7 +169,7 @@ class MemoryMapDBAdapterV2 extends MemoryMapDBAdapter { } @Override - void deleteMemoryBlock(long key) throws IOException { + void deleteMemoryBlock(MemoryBlockDB block) throws IOException { throw new UnsupportedOperationException(); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapterV3.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapterV3.java index 1c31013dd4..e72aa59342 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapterV3.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapterV3.java @@ -153,6 +153,14 @@ public class MemoryMapDBAdapterV3 extends MemoryMapDBAdapter { memoryBlocks.add(-insertionIndex - 1, newBlock); } + private void removeCachedBlock(MemoryBlockDB deletedBlock) { + int index = Collections.binarySearch(memoryBlocks, deletedBlock); + if (index < 0) { // should not find direct hit + return; + } + memoryBlocks.remove(index); + } + @Override MemoryBlockDB createInitializedBlock(String name, Address startAddr, InputStream is, long length, int permissions) throws AddressOverflowException, IOException { @@ -319,8 +327,9 @@ public class MemoryMapDBAdapterV3 extends MemoryMapDBAdapter { } @Override - void deleteMemoryBlock(long key) throws IOException { - memBlockTable.deleteRecord(key); + void deleteMemoryBlock(MemoryBlockDB block) throws IOException { + removeCachedBlock(block); + memBlockTable.deleteRecord(block.getID()); } @Override