From ae5662a50fb9cf59e192eaefa4a717a27b3de1c3 Mon Sep 17 00:00:00 2001 From: ghidravore Date: Mon, 12 Aug 2019 12:44:59 -0400 Subject: [PATCH] GT-3079 Added checking to binary loader to check for memory conflicts before loading in the "add to program" case. --- .../ghidra/app/util/MemoryBlockUtils.java | 23 ++++++++-- .../opinion/AbstractLibrarySupportLoader.java | 4 +- .../util/opinion/AbstractProgramLoader.java | 2 +- .../ghidra/app/util/opinion/BinaryLoader.java | 42 ++++++++++--------- .../ghidra/app/util/opinion/CoffLoader.java | 4 +- .../ghidra/app/util/opinion/ElfLoader.java | 4 +- .../ghidra/app/util/opinion/GdtLoader.java | 2 +- .../ghidra/app/util/opinion/GzfLoader.java | 2 +- .../app/util/opinion/IntelHexLoader.java | 2 +- .../app/util/opinion/IntelHexMemImage.java | 21 ++-------- .../java/ghidra/app/util/opinion/Loader.java | 5 ++- .../app/util/opinion/MotorolaHexLoader.java | 25 +++-------- .../ghidra/app/util/opinion/PeLoader.java | 4 +- .../ghidra/app/util/opinion/XmlLoader.java | 2 +- .../plugin/importer/AddToProgramDialog.java | 24 ++++++++--- .../plugin/importer/ImporterDialog.java | 13 +++--- .../ghidra/app/util/MemoryBlockUtilTest.java | 38 ++++++++++++++--- .../generic/test/AbstractGenericTest.java | 10 ++--- .../main/java/skeleton/SkeletonLoader.java | 4 +- 19 files changed, 132 insertions(+), 99 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/MemoryBlockUtils.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/MemoryBlockUtils.java index 54115d3abf..de68519eb7 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/MemoryBlockUtils.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/MemoryBlockUtils.java @@ -225,14 +225,13 @@ public class MemoryBlockUtils { block = program.getMemory().createInitializedBlock(name, start, fileBytes, offset, length, isOverlay); } - catch (MemoryConflictException e) { - block = program.getMemory().createInitializedBlock(name, start, fileBytes, offset, - length, true); + catch (MemoryConflictException | DuplicateNameException e) { + block = createBlockNoDuplicateName(program, name, start, fileBytes, offset, length); log.appendMsg("Conflict attempting to create memory block: " + name + " at address " + start.toString() + " Created block in new overlay instead"); } } - catch (LockException | DuplicateNameException | MemoryConflictException e) { + catch (LockException | MemoryConflictException e) { throw new RuntimeException(e); } @@ -241,6 +240,22 @@ public class MemoryBlockUtils { return block; } + private static MemoryBlock createBlockNoDuplicateName(Program program, String blockName, + Address start, FileBytes fileBytes, long offset, long length) + throws LockException, MemoryConflictException, AddressOverflowException { + int count = 1; + String name = blockName; + while (true) { + try { + return program.getMemory().createInitializedBlock(name, start, fileBytes, offset, + length, true); + } + catch (DuplicateNameException e) { + name = blockName + "_" + count++; + } + } + } + /** * Creates a new initialized block in memory using the bytes from the given input stream. * If there is a conflict when creating this block (some other block occupies at least some diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/AbstractLibrarySupportLoader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/AbstractLibrarySupportLoader.java index 69cc915f9a..4dbf12095e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/AbstractLibrarySupportLoader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/AbstractLibrarySupportLoader.java @@ -139,7 +139,7 @@ public abstract class AbstractLibrarySupportLoader extends AbstractProgramLoader } @Override - public String validateOptions(ByteProvider provider, LoadSpec loadSpec, List