From 802bafb70d99778b2cc0bd30d88e4a1117609ef1 Mon Sep 17 00:00:00 2001
From: Eric Dong <eric.dong@intel.com>
Date: Mon, 4 May 2015 13:43:52 +0800
Subject: [Patch] BaseTools: Add boudary check for minimum/maximum/default
 value.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eric Dong <eric.dong@intel.com>
---
 BaseTools/Source/C/VfrCompile/VfrSyntax.g | 73 +++++++++++++++++++++++++++++--
 1 file changed, 69 insertions(+), 4 deletions(-)

diff --git a/BaseTools/Source/C/VfrCompile/VfrSyntax.g b/BaseTools/Source/C/VfrCompile/VfrSyntax.g
index d014aff..616eea6 100644
--- a/BaseTools/Source/C/VfrCompile/VfrSyntax.g
+++ b/BaseTools/Source/C/VfrCompile/VfrSyntax.g
@@ -1393,38 +1393,64 @@ vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr,
   )
   ;
 
 vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :
   <<
-    EFI_GUID Guid;
-    BOOLEAN  Negative = FALSE;
+    EFI_GUID    Guid;
+    BOOLEAN     Negative = FALSE;
+    BOOLEAN     IntDecStyle = FALSE;
+    CIfrNumeric *NumericQst = NULL;
+    if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {
+      NumericQst = (CIfrNumeric *) gCurrentQuestion;
+      IntDecStyle = (NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0 ? TRUE : FALSE;
+    }
   >>
     {
       "\-"                                          << Negative = TRUE;  >>
     }
     N1:Number                                       <<
                                                        switch ($Type) {
                                                        case EFI_IFR_TYPE_NUM_SIZE_8 :
                                                          $Value.u8 = _STOU8(N1->getText(), N1->getLine());
+                                                         if (IntDecStyle) {
+                                                           if ($Value.u8 > 0x7F) {
+                                                             _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can big than 0x7F, small than -0x7F");
+                                                           }
+                                                         }
                                                          if (Negative) {
                                                            $Value.u8 = ~$Value.u8 + 1;
                                                          }
                                                        break;
                                                        case EFI_IFR_TYPE_NUM_SIZE_16 :
                                                          $Value.u16 = _STOU16(N1->getText(), N1->getLine());
+                                                         if (IntDecStyle) {
+                                                           if ($Value.u16 > 0x7FFF) {
+                                                             _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can big than 0x7FFF, small than -0x7FFF");
+                                                           }
+                                                         }
                                                          if (Negative) {
                                                            $Value.u16 = ~$Value.u16 + 1;
                                                          }
                                                        break;
                                                        case EFI_IFR_TYPE_NUM_SIZE_32 :
                                                          $Value.u32    = _STOU32(N1->getText(), N1->getLine());
+                                                         if (IntDecStyle) {
+                                                           if ($Value.u32 > 0x7FFFFFFF) {
+                                                             _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can big than 0x7FFFFFFF, small than -0x7FFFFFFF");
+                                                           }
+                                                         }
                                                          if (Negative) {
                                                            $Value.u32 = ~$Value.u32 + 1;
                                                          }
                                                        break;
                                                        case EFI_IFR_TYPE_NUM_SIZE_64 :
                                                          $Value.u64    = _STOU64(N1->getText(), N1->getLine());
+                                                         if (IntDecStyle) {
+                                                           if ($Value.u64 > 0x7FFFFFFFFFFFFFFF) {
+                                                             _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can big than 0x7FFFFFFFFFFFFFFF, small than -0x7FFFFFFFFFFFFFFF");
+                                                           }
+                                                         }
                                                          if (Negative) {
                                                            $Value.u64 = ~$Value.u64 + 1;
                                                          }
                                                        break;
                                                        case EFI_IFR_TYPE_BOOLEAN :
@@ -2286,28 +2312,48 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
                                                             _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "\"-\" can't be used when not in int decimal type. ");
                                                           }
                                                           switch (_GET_CURRQEST_DATATYPE()) {
                                                           case EFI_IFR_TYPE_NUM_SIZE_64 :
                                                             MinU8 = _STOU64(I->getText(), I->getLine());
+                                                            if (IntDecStyle) {
+                                                              if (MinU8 > 0x7FFFFFFFFFFFFFFF) {
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can small than -0x7FFFFFFFFFFFFFFF");
+                                                              }
+                                                            }
                                                             if (MinNegative) {
                                                               MinU8 = ~MinU8 + 1;
                                                             }
                                                             break;
                                                           case EFI_IFR_TYPE_NUM_SIZE_32 :
                                                             MinU4 = _STOU32(I->getText(), I->getLine());
+                                                            if (IntDecStyle) {
+                                                              if (MinU4 > 0x7FFFFFFF) {
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can small than -0x7FFFFFFF");
+                                                              }
+                                                            }
                                                             if (MinNegative) {
                                                               MinU4 = ~MinU4 + 1;
                                                             }
                                                             break;
                                                           case EFI_IFR_TYPE_NUM_SIZE_16 :
                                                             MinU2 = _STOU16(I->getText(), I->getLine());
+                                                            if (IntDecStyle) {
+                                                              if (MinU2 > 0x7FFF) {
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can small than -0x7FFF");
+                                                              }
+                                                            }
                                                             if (MinNegative) {
                                                               MinU2 = ~MinU2 + 1;
                                                             }
                                                             break;
                                                           case EFI_IFR_TYPE_NUM_SIZE_8 :
                                                             MinU1 = _STOU8(I->getText(), I->getLine());
+                                                            if (IntDecStyle) {
+                                                              if (MinU1 > 0x7F) {
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can small than -0x7F");
+                                                              }
+                                                            }
                                                             if (MinNegative) {
                                                               MinU1 = ~MinU1 + 1;
                                                             }
                                                             break;
                                                           }
@@ -2315,17 +2361,22 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
   Maximum   "=" 
   { 
     "\-"                                               << MaxNegative = TRUE; >>
   }
   A:Number ","                                         <<
-                                                          if (!IntDecStyle &&  MaxNegative) {
+                                                          if (!IntDecStyle && MaxNegative) {
                                                             _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "\"-\" can't be used when not in int decimal type. ");
                                                           }
 
                                                           switch (_GET_CURRQEST_DATATYPE()) {
                                                           case EFI_IFR_TYPE_NUM_SIZE_64 : 
                                                             MaxU8 = _STOU64(A->getText(), A->getLine()); 
+                                                            if (IntDecStyle) {
+                                                              if (MaxU8 > 0x7FFFFFFFFFFFFFFF) {
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can big than 0x7FFFFFFFFFFFFFFF");
+                                                              }
+                                                            }
                                                             if (MaxNegative) {
                                                               MaxU8 = ~MaxU8 + 1;
                                                             }
                                                             if (IntDecStyle) {
                                                               if ((INT64) MaxU8 < (INT64) MinU8) {
@@ -2337,10 +2388,15 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
                                                               }
                                                             }
                                                             break;
                                                           case EFI_IFR_TYPE_NUM_SIZE_32 : 
                                                             MaxU4 = _STOU32(A->getText(), A->getLine());
+                                                            if (IntDecStyle) {
+                                                              if (MaxU4 > 0x7FFFFFFF) {
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can big than 0x7FFFFFFF");
+                                                              }
+                                                            }
                                                             if (MaxNegative) {
                                                               MaxU4 = ~MaxU4 + 1;
                                                             }
                                                             if (IntDecStyle) {
                                                               if ((INT32) MaxU4 < (INT32) MinU4) {
@@ -2352,14 +2408,18 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
                                                               }
                                                             }
                                                             break;
                                                           case EFI_IFR_TYPE_NUM_SIZE_16 : 
                                                             MaxU2 = _STOU16(A->getText(), A->getLine()); 
+                                                            if (IntDecStyle) {
+                                                              if (MaxU2 > 0x7FFF) {
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can big than 0x7FFF");
+                                                              }
+                                                            }
                                                             if (MaxNegative) {
                                                               MaxU2 = ~MaxU2 + 1;
                                                             }
-
                                                             if (IntDecStyle) {
                                                               if ((INT16) MaxU2 < (INT16) MinU2) {
                                                                 _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");
                                                               }
                                                             } else {
@@ -2368,10 +2428,15 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
                                                               }
                                                             }
                                                             break;
                                                           case EFI_IFR_TYPE_NUM_SIZE_8 :  
                                                             MaxU1 = _STOU8(A->getText(), A->getLine());
+                                                            if (IntDecStyle) {
+                                                              if (MaxU1 > 0x7F) {
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can big than 0x7F");
+                                                              }
+                                                            }
                                                             if (MaxNegative) {
                                                               MaxU1 = ~MaxU1 + 1;
                                                             }
                                                             if (IntDecStyle) {
                                                               if ((INT8) MaxU1 < (INT8) MinU1) {
-- 
1.9.5.msysgit.1

