diff options
author | Teodor Madan | 2014-04-08 11:12:21 +0000 |
---|---|---|
committer | Teodor Madan | 2014-04-11 10:35:52 +0000 |
commit | 882369b295726765c09898a055a9d9abd4597f5c (patch) | |
tree | c0ab369b9277f94fa2817a832e805b00f8449aa4 | |
parent | 48298d3923aa7968dd2f627214fa598a16a9d4ca (diff) | |
download | org.eclipse.cdt-882369b295726765c09898a055a9d9abd4597f5c.tar.gz org.eclipse.cdt-882369b295726765c09898a055a9d9abd4597f5c.tar.xz org.eclipse.cdt-882369b295726765c09898a055a9d9abd4597f5c.zip |
Bug 432254 - Add memory monitor does not check for address out of range
Change-Id: I5fee242d73f8e24ac7dfb637bb79b49f6988cd69
Signed-off-by: Teodor Madan <teodor.madan@freescale.com>
Reviewed-on: https://git.eclipse.org/r/24627
Tested-by: Hudson CI
3 files changed, 24 insertions, 1 deletions
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/GdbMemoryBlockRetrieval.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/GdbMemoryBlockRetrieval.java index 64e23511a74..994822cf063 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/GdbMemoryBlockRetrieval.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/GdbMemoryBlockRetrieval.java @@ -29,6 +29,7 @@ import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext; import org.eclipse.cdt.dsf.debug.service.IMemorySpaces; import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; import org.eclipse.cdt.dsf.gdb.internal.memory.GdbMemoryBlock.MemorySpaceDMContext; +import org.eclipse.cdt.dsf.gdb.service.IGDBMemory; import org.eclipse.cdt.dsf.gdb.service.IGDBMemory2; import org.eclipse.cdt.dsf.service.DsfServices; import org.eclipse.cdt.dsf.service.DsfSession; @@ -49,6 +50,8 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import com.ibm.icu.text.MessageFormat; + /** * A specialization of the DSF memory block retrieval implementation supporting * memory spaces. The memory space support is provisional, thus this class is @@ -173,6 +176,14 @@ public class GdbMemoryBlockRetrieval extends DsfMemoryBlockRetrieval implements } } + // check for block address exceeding maximum allowed address value + int addressSize = getAddressSize(memoryDmc, memorySpaceID); + BigInteger endAddress = BigInteger.ONE.shiftLeft(addressSize*8).subtract(BigInteger.ONE); + if (endAddress.compareTo(blockAddress) < 0) { + throw new DebugException(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, -1, + MessageFormat.format(Messages.Err_ExceedsMaxAddress, expression, endAddress.toString(16)), null)); + } + /* * At this point, we only resolved the requested memory block * start address and we have no idea of the block's length. @@ -403,6 +414,16 @@ public class GdbMemoryBlockRetrieval extends DsfMemoryBlockRetrieval implements return super.getAddressableSize(); } + + private int getAddressSize(IMemoryDMContext aContext, String memorySpaceID) { + IGDBMemory memoryService = (IGDBMemory)getServiceTracker().getService(); + if (memoryService != null && aContext != null) { + IMemoryDMContext context = resolveMemSpaceContext(aContext, memorySpaceID); + return memoryService.getAddressSize(context); + } + return super.getAddressSize(); + } + private IMemoryDMContext resolveMemSpaceContext(IMemoryDMContext aContext, String aMemorySpaceID) { IMemoryDMContext context = aContext; if (aMemorySpaceID != null && aMemorySpaceID.length() > 0) { diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/Messages.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/Messages.java index 83f2cea57b6..627fee0d25a 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/Messages.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/Messages.java @@ -21,7 +21,8 @@ public class Messages extends NLS { NLS.initializeMessages("org.eclipse.cdt.dsf.gdb.internal.memory.messages", Messages.class); //$NON-NLS-1$ } - public static String Err_MemoryServiceNotAvailable; + public static String Err_ExceedsMaxAddress; + public static String Err_MemoryServiceNotAvailable; public static String Err_MemoryReadFailed; public static String Err_MemoryWriteFailed; public static String Err_InvalidEncodedAddress; diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/messages.properties b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/messages.properties index 9a8f8148b26..ea7e2c1a2a8 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/messages.properties +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/messages.properties @@ -9,6 +9,7 @@ # Freescale Semiconductor - initial API and implementation ############################################################################### +Err_ExceedsMaxAddress=Expression value {0} exceeds maximum address 0x{1} Err_MemoryServiceNotAvailable=The required DSF memory service is not available. Err_MemoryReadFailed=Error reading memory block Err_MemoryWriteFailed=Error writing memory block |