From 2ea66d6fb41f8793805ef2a260df500138a9c680 Mon Sep 17 00:00:00 2001 From: dev747368 <48332326+dev747368@users.noreply.github.com> Date: Fri, 16 May 2025 22:00:33 +0000 Subject: [PATCH] GP-0 more fixes for new definedstringiterator and unions --- .../program/util/DefinedStringIteratorTest.java | 17 +++++++++++++++++ .../program/util/DefinedStringIterator.java | 15 ++++++++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Ghidra/Features/Base/src/test/java/ghidra/program/util/DefinedStringIteratorTest.java b/Ghidra/Features/Base/src/test/java/ghidra/program/util/DefinedStringIteratorTest.java index 89f999a368..531d028898 100644 --- a/Ghidra/Features/Base/src/test/java/ghidra/program/util/DefinedStringIteratorTest.java +++ b/Ghidra/Features/Base/src/test/java/ghidra/program/util/DefinedStringIteratorTest.java @@ -161,6 +161,23 @@ public class DefinedStringIteratorTest extends AbstractGhidraHeadlessIntegration assertEquals(1, list.size()); } + @Test + public void test_UnionOfStrings() throws Exception { + int unionAddr = 0x100; + Union unionDT = new UnionDataType("unionOfStrings"); + unionDT.add(charArray); + unionDT.add(new ArrayDataType(charDT, 5)); + + builder.applyFixedLengthDataType(addrStr(unionAddr), unionDT, -1); + + DefinedStringIterator it = DefinedStringIterator.forProgram(program); + List list = IteratorUtils.toList(it); + + assertEquals(0x100, list.get(0).getAddress().getOffset()); + assertEquals(0x100, list.get(1).getAddress().getOffset()); + assertEquals(2, list.size()); + } + private long arrayElementAddr(long arrayAddr, int elemSize, int elemIndex) { return arrayAddr + (elemSize * elemIndex); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/DefinedStringIterator.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/DefinedStringIterator.java index 1043c654df..ffb78f8a53 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/DefinedStringIterator.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/util/DefinedStringIterator.java @@ -133,12 +133,14 @@ public class DefinedStringIterator implements DataIterator { // be handled earlier by isString(data) DataType elementDT = arrayDT.getDataType(); if (containsStringDataType(elementDT)) { - itStack.addLast(new ArrayElementIterator(data)); + itStack.addLast(new DataComponentIterator(data)); } // side-effect: don't iterate arrays that have elements that aren't strings } else if (dt instanceof Composite comp && containsStringDataType(comp)) { - itStack.addLast(new StructDtcIterator(data, comp)); + itStack.addLast(comp instanceof Structure + ? new StructDtcIterator(data, comp) + : new DataComponentIterator(data)); } } } @@ -176,6 +178,7 @@ public class DefinedStringIterator implements DataIterator { } private static class StructDtcIterator implements DataIterator { + // this iterator only examines defined components of the data struct item private Data data; private int currentIndex = -1; private DataTypeComponent[] dtcs; @@ -194,7 +197,8 @@ public class DefinedStringIterator implements DataIterator { private void advanceToNextGoodDtcIndex() { currentIndex++; while (currentIndex < dtcs.length && - (dtcs[currentIndex].getLength() == 0 || dtcs[currentIndex].isBitFieldComponent())) { + (dtcs[currentIndex].getLength() == 0 || dtcs[currentIndex].isBitFieldComponent() || + data.getComponentContaining(dtcs[currentIndex].getOffset()) == null)) { currentIndex++; } } @@ -208,12 +212,13 @@ public class DefinedStringIterator implements DataIterator { } - private static class ArrayElementIterator implements DataIterator { + private static class DataComponentIterator implements DataIterator { + // use this iterator for datatypes that only have defined components (array, union) private Data data; private int currentIndex; private int elementCount; - public ArrayElementIterator(Data data) { + public DataComponentIterator(Data data) { this.data = data; this.elementCount = data.getNumComponents(); }