diff --git a/src/xercesc/util/XMLAbstractDoubleFloat.cpp b/src/xercesc/util/XMLAbstractDoubleFloat.cpp
index 734e06e382e5cdaad2d1e56b47e5239b4b9442a3..8ba09b1565044aeef684cb590bba516d11842c69 100644
--- a/src/xercesc/util/XMLAbstractDoubleFloat.cpp
+++ b/src/xercesc/util/XMLAbstractDoubleFloat.cpp
@@ -376,10 +376,18 @@ void XMLAbstractDoubleFloat::normalizeZero(XMLCh* const inData)
 	{
 		minusSeen = true;
 		srcStr++;
+        if (!*srcStr)
+        {
+            ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_Inv_chars, getMemoryManager());
+        }
 	}
 	else if (*srcStr == chPlus)
 	{
 		srcStr++;
+        if (!*srcStr)
+        {
+            ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_Inv_chars, getMemoryManager());
+        }
 	}
 
 	// scan the string
diff --git a/src/xercesc/util/XMLBigDecimal.cpp b/src/xercesc/util/XMLBigDecimal.cpp
index b2ebada72adbb603130997052ab65be573855f21..f61852384980446c939aa7358898622cf83b270b 100644
--- a/src/xercesc/util/XMLBigDecimal.cpp
+++ b/src/xercesc/util/XMLBigDecimal.cpp
@@ -231,10 +231,18 @@ void  XMLBigDecimal::parseDecimal(const XMLCh* const toParse
     {
         sign = -1;
         startPtr++;
+        if (startPtr == endPtr)
+        {
+            ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_Inv_chars, manager);
+        }
     }
     else if (*startPtr == chPlus)
     {
-        startPtr++;
+        startPtr++;         
+        if (startPtr == endPtr)
+        {
+            ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_Inv_chars, manager);
+        }
     }
 
     // Strip leading zeros
@@ -321,10 +329,18 @@ void  XMLBigDecimal::parseDecimal(const XMLCh*         const toParse
     if (*startPtr == chDash)
     {
         startPtr++;
+        if (startPtr == endPtr)
+        {
+            ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_Inv_chars, manager);
+        }
     }
     else if (*startPtr == chPlus)
     {
         startPtr++;
+        if (startPtr == endPtr)
+        {
+            ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_Inv_chars, manager);
+        }
     }
 
     // Strip leading zeros
diff --git a/src/xercesc/util/XMLBigInteger.cpp b/src/xercesc/util/XMLBigInteger.cpp
index cf63836e2501b3d0e04967393743ec24443061df..cb4bbdfff77b0ca0d99fc0c332e7cbb42dc5f8a8 100644
--- a/src/xercesc/util/XMLBigInteger.cpp
+++ b/src/xercesc/util/XMLBigInteger.cpp
@@ -135,13 +135,22 @@ void XMLBigInteger::parseBigInteger(const XMLCh* const toConvert
     {
         signValue = -1;
         startPtr++;
+        if (startPtr == endPtr)
+        {
+            ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_Inv_chars, manager);
+        }
     }
     else if (*startPtr == chPlus)
     {
         // skip the '+'
         startPtr++;
+        if (startPtr == endPtr)
+        {
+            ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_Inv_chars, manager);
+        }
     }
 
+
     // Scan past any leading zero.
     while (*startPtr == chDigit_0)
         startPtr++;