From 68108b088e640591f4fb8a1188df856207650e9a Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Thu, 12 Sep 2019 17:09:07 -0400 Subject: [PATCH] GT-3151 Correct PDB composite buildup error involving bitfields --- .../util/bin/format/pdb/DefaultCompositeMember.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb/DefaultCompositeMember.java b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb/DefaultCompositeMember.java index 981de8f73f..f69eeb0596 100644 --- a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb/DefaultCompositeMember.java +++ b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/bin/format/pdb/DefaultCompositeMember.java @@ -1084,6 +1084,7 @@ class DefaultCompositeMember extends CompositeMember { // must remove sibling bit fields at same offset but must leave // first one behind to facilitate subsequent component swap. boolean skipIfEqual = true; + int truncateOrdinal = -1; for (DataTypeComponent component : parentStruct.getComponents()) { int offset = component.getOffset(); if (offset >= memberOffset) { @@ -1091,11 +1092,18 @@ class DefaultCompositeMember extends CompositeMember { skipIfEqual = false; } else { - parentStruct.clearComponent(component.getOrdinal()); + if (truncateOrdinal < 0) { + truncateOrdinal = component.getOrdinal(); + } parent.structureMemberOffsetMap.remove(offset); } } } + if (truncateOrdinal >= 0) { + while (parentStruct.getNumComponents() > truncateOrdinal) { + parentStruct.delete(truncateOrdinal); + } + } parent.structureMemberRangeMap.paintRange(memberOffset + getLength(), parent.getLength(), -1);