Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeodor Madan2014-04-08 11:12:21 +0000
committerTeodor Madan2014-04-11 10:35:52 +0000
commit882369b295726765c09898a055a9d9abd4597f5c (patch)
treec0ab369b9277f94fa2817a832e805b00f8449aa4
parent48298d3923aa7968dd2f627214fa598a16a9d4ca (diff)
downloadorg.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
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/GdbMemoryBlockRetrieval.java21
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/Messages.java3
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/memory/messages.properties1
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

Back to the top