From e266e58f985427a340bbe7e01a321a2a00c19db9 Mon Sep 17 00:00:00 2001 From: Randy Rohrbach Date: Tue, 22 May 2012 15:21:11 -0400 Subject: [PATCH] Bug 379968 : Memory find/replace does not account for target endian-ness --- .../ui/memory/search/FindReplaceDialog.java | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/memory/org.eclipse.cdt.debug.ui.memory.search/src/org/eclipse/cdt/debug/ui/memory/search/FindReplaceDialog.java b/memory/org.eclipse.cdt.debug.ui.memory.search/src/org/eclipse/cdt/debug/ui/memory/search/FindReplaceDialog.java index 59f5b666fac..5fa3f6a1ccc 100644 --- a/memory/org.eclipse.cdt.debug.ui.memory.search/src/org/eclipse/cdt/debug/ui/memory/search/FindReplaceDialog.java +++ b/memory/org.eclipse.cdt.debug.ui.memory.search/src/org/eclipse/cdt/debug/ui/memory/search/FindReplaceDialog.java @@ -1134,7 +1134,15 @@ public class FindReplaceDialog extends SelectionDialog { try { - fMemoryBlock.setValue(currentPosition.subtract(fMemoryBlock.getBigBaseAddress()), replaceData); + if ((searchPhrase instanceof BigIntegerSearchPhrase) && (bytes.length > 0) && bytes[0].isEndianessKnown() && !bytes[0].isBigEndian()) + { + // swap the bytes when replacing an integer on little-endian targets + fMemoryBlock.setValue(currentPosition.subtract(fMemoryBlock.getBigBaseAddress()), swapBytes(replaceData)); + } + else + { + fMemoryBlock.setValue(currentPosition.subtract(fMemoryBlock.getBigBaseAddress()), replaceData); + } } catch(DebugException de) { @@ -1376,9 +1384,18 @@ public class FindReplaceDialog extends SelectionDialog byte[] targetBytes = new byte[bytes.length + 1]; targetBytes[0] = 0; for(int i = 0; i < bytes.length; i++) - targetBytes[i + 1] = bytes[i].getValue(); + { + if (bytes[i].isEndianessKnown() && !bytes[i].isBigEndian()) + { + // swap the bytes when matching an integer on little-endian targets + targetBytes[i + 1] = bytes[bytes.length - i - 1].getValue(); + } + else + { + targetBytes[i + 1] = bytes[i].getValue(); + } + } - // TODO endian? BigInteger targetBigInteger = new BigInteger(targetBytes); return fPhrase.equals(targetBigInteger); @@ -1395,6 +1412,14 @@ public class FindReplaceDialog extends SelectionDialog return processedBytes; } + private byte[] swapBytes(byte[] bytes) + { + byte[] processedBytes = new byte[bytes.length]; + for (int i = 0; i < bytes.length; i++) + processedBytes[i] = bytes[bytes.length - i - 1]; + return processedBytes; + } + interface IMemorySearchQuery extends ISearchQuery { public IMemoryRenderingSite getMemoryView();