diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/data/DataPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/data/DataPlugin.java index 191b4aefd1..dade3ff426 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/data/DataPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/data/DataPlugin.java @@ -384,6 +384,13 @@ public class DataPlugin extends Plugin implements DataService { return true; } + if (newSize <= 0) { + tool.setStatusInfo( + "Invalid data location. Unable to resolve data length at " + start + " for " + + dataType.getName()); + return false; + } + Address end = null; try { end = start.addNoWrap(newSize - 1); @@ -491,15 +498,6 @@ public class DataPlugin extends Plugin implements DataService { return newSize; } - if (dataType instanceof Dynamic || dataType instanceof FactoryDataType) { - MemoryBlock block = program.getMemory().getBlock(start); - if (block == null || !block.isInitialized()) { - tool.setStatusInfo( - dataType.getName() + " may only be applied on initialized memory"); - return -1; - } - } - DataTypeInstance dataTypeInstance = DataTypeInstance.getDataTypeInstance(dataType, new DumbMemBufferImpl(program.getMemory(), start), false); if (dataTypeInstance == null) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/code/CodeManager.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/code/CodeManager.java index 73e6ea22d3..4ab40ba900 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/code/CodeManager.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/code/CodeManager.java @@ -1952,13 +1952,6 @@ public class CodeManager implements ErrorHandler, ManagerDB { length = dataType.getLength(); } else if (dataType instanceof Dynamic) { - if (length <= 0 || !((Dynamic) dataType).canSpecifyLength()) { - MemoryBlock block = program.getMemory().getBlock(addr); - if (block == null || !block.isInitialized()) { - throw new CodeUnitInsertionException(originalDataType.getName() + - " may only be applied on initialized memory (" + addr + ")"); - } - } Dynamic dynamicDataType = (Dynamic) dataType; MemBuffer memBuffer = new MemoryBufferImpl(program.getMemory(), addr); length = dynamicDataType.getLength(memBuffer, length); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDB.java index c163297c63..980c10c5d8 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDB.java @@ -346,6 +346,9 @@ public class MemoryMapDB implements Memory, ManagerDB, LiveMemoryListener { block.getName() + " does not contain address " + start.toString(true)); } + // TODO: We should not really permit changing Data where Dynamic datatype resides + // since it could impact its computed length. + try { Address endAddr = start.addNoWrap(length - 1); if (!block.contains(start)) {