From c0c37d14d1bb4d897b0fbc6eff05cfe052f6c0f1 Mon Sep 17 00:00:00 2001 From: dev747368 <48332326+dev747368@users.noreply.github.com> Date: Tue, 2 Jan 2024 20:34:32 +0000 Subject: [PATCH] GP-4187 fix goslice to not mess up packing of other structures --- .../bin/format/golang/rtti/types/GoSliceType.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/golang/rtti/types/GoSliceType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/golang/rtti/types/GoSliceType.java index e97b1dd8aa..585dcbb294 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/golang/rtti/types/GoSliceType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/golang/rtti/types/GoSliceType.java @@ -52,9 +52,17 @@ public class GoSliceType extends GoType { @Override public DataType recoverDataType() throws IOException { + Structure genericSliceDT = programContext.getGenericSliceDT(); + StructureDataType sliceDT = new StructureDataType(programContext.getRecoveredTypesCp(getPackagePathString()), - getUniqueTypename(), 0, programContext.getDTM()); + getUniqueTypename(), genericSliceDT.getLength(), programContext.getDTM()); + + // ensure the sliceDT is filled out before getting the element's data type to ensure + // any other data types pulled in that ref this slice don't change size when trying to + // enable packing + sliceDT.replaceWith(genericSliceDT); + programContext.cacheRecoveredDataType(this, sliceDT); // fixup the generic void* field with the specific element* type @@ -62,9 +70,6 @@ public class GoSliceType extends GoType { DataType elementDT = programContext.getRecoveredType(elementType); Pointer elementPtrDT = programContext.getDTM().getPointer(elementDT); - Structure genericSliceDT = programContext.getGenericSliceDT(); - sliceDT.replaceWith(genericSliceDT); - int arrayPtrComponentIndex = 0; /* HACK, field ordinal of void* data field in slice type */ DataTypeComponent arrayDTC = genericSliceDT.getComponent(arrayPtrComponentIndex); sliceDT.replace(arrayPtrComponentIndex, elementPtrDT, -1, arrayDTC.getFieldName(),