GP-3314 corrected zero-length DataComponent issue

This commit is contained in:
ghidra1 2023-04-11 16:43:29 -04:00
parent f6922713b1
commit b8fed4fd80
2 changed files with 20 additions and 16 deletions

View file

@ -40,7 +40,9 @@ class DataComponent extends DataDB {
private int[] path;
/**
* Constructs a new DataComponent
* Constructs a new {@link DataComponent} for a {@link DataTypeComponent}.
* NOTE: a zero-length component will be forced to have a length of 1-byte.
* This can result in what would appear to be overlapping components with the same overset.
* @param codeMgr the code manager.
* @param componentCache data component cache
* @param address the address of the data component
@ -57,29 +59,31 @@ class DataComponent extends DataDB {
this.component = component;
this.level = parent.level + 1;
this.offset = component.getOffset();
this.length = component.getLength();
length = component.getLength();
if (length == 0) {
length = 1; // zero-length components must be forced to have a length of 1
}
}
/**
* Constructs a new array DataComponent.
* Constructs a new {@link DataComponent} for an {@link Array} element.
* @param codeMgr the code manager.
* @param componentCache data component cache
* @param address the address of the data component
* @param addr the convert address long value
* @param parent the DataDB object that contains this component.
* @param array the array containing this component.
* @param ordinal the ordinal for this component.
* @param offset the offset of this component within its parent.
* @param length the length of this component.
* @param ordinal the array index for this component.
*/
DataComponent(CodeManager codeMgr, DBObjectCache<DataDB> componentCache, Address address,
long addr, DataDB parent, Array array, int ordinal, int offset, int length) {
long addr, DataDB parent, Array array, int ordinal) {
super(codeMgr, componentCache, ordinal, address, addr, array.getDataType());
int elementLength = array.getElementLength();
this.indexInParent = ordinal;
this.parent = parent;
this.offset = offset;
this.offset = ordinal * elementLength;
this.level = parent.level + 1;
this.length = length;
this.length = elementLength;
}
@Override
@ -102,6 +106,9 @@ class DataComponent extends DataDB {
dataType = c.getDataType();
offset = component.getOffset();
length = component.getLength();
if (length == 0) {
length = 1; // zero-length components must be forced to have a length of 1
}
}
else if (pdt instanceof Array) {
Array a = (Array) pdt;

View file

@ -230,19 +230,16 @@ class DataDB extends CodeUnitDB implements Data {
if (baseDataType instanceof Array) {
Array array = (Array) baseDataType;
int elementLength = array.getElementLength();
Address componentAddr = address.add(index * elementLength);
Address componentAddr = address.add(index * array.getElementLength());
return new DataComponent(codeMgr, componentCache, componentAddr,
addressMap.getKey(componentAddr, false), this, array, index,
index * elementLength, elementLength);
addressMap.getKey(componentAddr, false), this, array, index);
}
if (baseDataType instanceof Composite) {
Composite struct = (Composite) baseDataType;
DataTypeComponent dtc = struct.getComponent(index);
Composite composite = (Composite) baseDataType;
DataTypeComponent dtc = composite.getComponent(index);
Address componentAddr = address.add(dtc.getOffset());
return new DataComponent(codeMgr, componentCache, componentAddr,
addressMap.getKey(componentAddr, false), this, dtc);
}
if (baseDataType instanceof DynamicDataType) {
DynamicDataType ddt = (DynamicDataType) baseDataType;