Index: Source/C/VfrCompile/VfrSyntax.g
===================================================================
--- Source/C/VfrCompile/VfrSyntax.g	(revision 2664)
+++ Source/C/VfrCompile/VfrSyntax.g	(working copy)
@@ -4342,11 +4342,12 @@
   UINT8   Value;
   CHAR8   c;
 
+  UINT8 PreviousValue;
+  CHAR8 *OrigString = Str;
+  CHAR8 ErrorMsg[100];
   Str = TrimHex (Str, &IsHex);
   for (Value = 0; (c = *Str) != '\0'; Str++) {
-    //
-    // BUG: does not handle overflow here
-    //
+    PreviousValue = Value;
     (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);
 
     if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {
@@ -4358,6 +4359,10 @@
     if (c >= '0' && c <= '9') {
       Value += (c - '0');
     }
+    if( (IsHex && (Value/16) != PreviousValue) || (!IsHex && (Value/10) != PreviousValue ) ) {
+      sprintf(ErrorMsg, "Overflow: Value %s is too large to  store in a UINT8", OrigString); 
+      _PCATCH (VFR_RETURN_INVALID_PARAMETER, 0, ErrorMsg);
+    }
   }
 
   return Value;
@@ -4372,11 +4377,12 @@
   UINT16  Value;
   CHAR8   c;
 
+  UINT16 PreviousValue;
+  CHAR8 *OrigString = Str;
+  CHAR8 ErrorMsg[100];
   Str = TrimHex (Str, &IsHex);
   for (Value = 0; (c = *Str) != '\0'; Str++) {
-    //
-    // BUG: does not handle overflow here
-    //
+    PreviousValue = Value;
     (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);
 
     if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {
@@ -4388,6 +4394,10 @@
     if (c >= '0' && c <= '9') {
       Value += (c - '0');
     }
+    if( (IsHex && (Value/16) != PreviousValue) || (!IsHex && (Value/10) != PreviousValue ) ) {
+      sprintf(ErrorMsg, "Overflow: Value %s is too large to  store in a UINT16", OrigString); 
+      _PCATCH (VFR_RETURN_INVALID_PARAMETER, 0, ErrorMsg);
+    }
   }
 
   return Value;
@@ -4402,11 +4412,12 @@
   UINT32  Value;
   CHAR8   c;
 
+  UINT32 PreviousValue;
+  CHAR8 *OrigString = Str;
+  CHAR8 ErrorMsg[100];
   Str = TrimHex (Str, &IsHex);
   for (Value = 0; (c = *Str) != '\0'; Str++) {
-    //
-    // BUG: does not handle overflow here
-    //
+    PreviousValue = Value;
     (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);
 
     if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {
@@ -4418,6 +4429,10 @@
     if (c >= '0' && c <= '9') {
       Value += (c - '0');
     }
+    if( (IsHex && (Value/16) != PreviousValue) || (!IsHex && (Value/10) != PreviousValue ) ) {
+      sprintf(ErrorMsg, "Overflow: Value %s is too large to  store in a UINT32", OrigString); 
+      _PCATCH (VFR_RETURN_INVALID_PARAMETER, 0, ErrorMsg);
+    }
   }
 
   return Value;
@@ -4431,12 +4446,13 @@
   BOOLEAN IsHex;
   UINT64  Value;
   CHAR8   c;
+  UINT64 PreviousValue;
+  CHAR8 *OrigString = Str;
+  CHAR8 ErrorMsg[100];
 
   Str = TrimHex (Str, &IsHex);
   for (Value = 0; (c = *Str) != '\0'; Str++) {
-    //
-    // BUG: does not handle overflow here
-    //
+    PreviousValue = Value;
     (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);
 
     if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {
@@ -4448,6 +4464,10 @@
     if (c >= '0' && c <= '9') {
       Value += (c - '0');
     }
+    if( (IsHex && (Value/16) != PreviousValue) || (!IsHex && (Value/10) != PreviousValue ) ) {
+      sprintf(ErrorMsg, "Overflow: Value %s is too large to  store in a UINT64", OrigString); 
+      _PCATCH (VFR_RETURN_INVALID_PARAMETER, 0, ErrorMsg);
+    }
   }
 
   return Value;
