MdeModulePkg CapsuleApp: Check capsule header for -D and -N options
authorStar Zeng <star.zeng@intel.com>
Thu, 26 Jul 2018 08:59:43 +0000 (16:59 +0800)
committerStar Zeng <star.zeng@intel.com>
Fri, 27 Jul 2018 08:04:16 +0000 (16:04 +0800)
Then meaningful error message can be shown when the input image is
unexpected.

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
MdeModulePkg/Application/CapsuleApp/CapsuleDump.c

index 2967b0d..894da2f 100644 (file)
@@ -362,6 +362,60 @@ GetEsrtFwType (
   return ESRT_FW_TYPE_UNKNOWN;\r
 }\r
 \r
+/**\r
+  Validate if it is valid capsule header\r
+\r
+  This function assumes the caller provided correct CapsuleHeader pointer\r
+  and CapsuleSize.\r
+\r
+  This function validates the fields in EFI_CAPSULE_HEADER.\r
+\r
+  @param[in] CapsuleHeader  Points to a capsule header.\r
+  @param[in] CapsuleSize    Size of the whole capsule image.\r
+\r
+**/\r
+BOOLEAN\r
+IsValidCapsuleHeader (\r
+  IN EFI_CAPSULE_HEADER     *CapsuleHeader,\r
+  IN UINT64                 CapsuleSize\r
+  )\r
+{\r
+  if (CapsuleSize < sizeof (EFI_CAPSULE_HEADER)) {\r
+    return FALSE;\r
+  }\r
+  if (CapsuleHeader->CapsuleImageSize != CapsuleSize) {\r
+    return FALSE;\r
+  }\r
+  if (CapsuleHeader->HeaderSize > CapsuleHeader->CapsuleImageSize) {\r
+    return FALSE;\r
+  }\r
+  if (CapsuleHeader->HeaderSize < sizeof (EFI_CAPSULE_HEADER)) {\r
+    return FALSE;\r
+  }\r
+\r
+  return TRUE;\r
+}\r
+\r
+/**\r
+  Return if this CapsuleGuid is a FMP capsule GUID or not.\r
+\r
+  @param[in] CapsuleGuid A pointer to EFI_GUID\r
+\r
+  @retval TRUE  It is a FMP capsule GUID.\r
+  @retval FALSE It is not a FMP capsule GUID.\r
+**/\r
+BOOLEAN\r
+IsFmpCapsuleGuid (\r
+  IN EFI_GUID  *CapsuleGuid\r
+  )\r
+{\r
+  if (CompareGuid(&gEfiFmpCapsuleGuid, CapsuleGuid)) {\r
+    return TRUE;\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
 /**\r
   Append a capsule header on top of current image.\r
   This function follows Windows UEFI Firmware Update Platform document.\r
@@ -407,15 +461,28 @@ CreateNestedFmp (
     Print(L"CapsuleApp: Capsule image (%s) is not found.\n", CapsuleName);\r
     goto Done;\r
   }\r
+  if (!IsValidCapsuleHeader (CapsuleBuffer, FileSize)) {\r
+    Print(L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName);\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
+  }\r
+\r
+  if (!IsFmpCapsuleGuid (&((EFI_CAPSULE_HEADER *) CapsuleBuffer)->CapsuleGuid)) {\r
+    Print(L"CapsuleApp: Capsule image (%s) is not a FMP capsule.\n", CapsuleName);\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
+  }\r
 \r
   ImageTypeId = GetCapsuleImageTypeId(CapsuleBuffer);\r
   if (ImageTypeId == NULL) {\r
     Print(L"CapsuleApp: Capsule ImageTypeId is not found.\n");\r
+    Status = EFI_INVALID_PARAMETER;\r
     goto Done;\r
   }\r
   FwType = GetEsrtFwType(ImageTypeId);\r
   if ((FwType != ESRT_FW_TYPE_SYSTEMFIRMWARE) && (FwType != ESRT_FW_TYPE_DEVICEFIRMWARE)) {\r
     Print(L"CapsuleApp: Capsule FwType is invalid.\n");\r
+    Status = EFI_INVALID_PARAMETER;\r
     goto Done;\r
   }\r
 \r
@@ -724,40 +791,6 @@ CleanGatherList (
   }\r
 }\r
 \r
-/**\r
-  Validate if it is valid capsule header\r
-\r
-  This function assumes the caller provided correct CapsuleHeader pointer\r
-  and CapsuleSize.\r
-\r
-  This function validates the fields in EFI_CAPSULE_HEADER.\r
-\r
-  @param[in] CapsuleHeader  Points to a capsule header.\r
-  @param[in] CapsuleSize    Size of the whole capsule image.\r
-\r
-**/\r
-BOOLEAN\r
-IsValidCapsuleHeader (\r
-  IN EFI_CAPSULE_HEADER     *CapsuleHeader,\r
-  IN UINT64                 CapsuleSize\r
-  )\r
-{\r
-  if (CapsuleSize < sizeof (EFI_CAPSULE_HEADER)) {\r
-    return FALSE;\r
-  }\r
-  if (CapsuleHeader->CapsuleImageSize != CapsuleSize) {\r
-    return FALSE;\r
-  }\r
-  if (CapsuleHeader->HeaderSize > CapsuleHeader->CapsuleImageSize) {\r
-    return FALSE;\r
-  }\r
-  if (CapsuleHeader->HeaderSize < sizeof (EFI_CAPSULE_HEADER)) {\r
-    return FALSE;\r
-  }\r
-\r
-  return TRUE;\r
-}\r
-\r
 /**\r
   Print APP usage.\r
 **/\r
index 11bf2e1..45c3ecd 100644 (file)
@@ -61,6 +61,24 @@ WriteFileFromBuffer (
   IN  VOID                                 *Buffer\r
   );\r
 \r
+/**\r
+  Validate if it is valid capsule header\r
+\r
+  This function assumes the caller provided correct CapsuleHeader pointer\r
+  and CapsuleSize.\r
+\r
+  This function validates the fields in EFI_CAPSULE_HEADER.\r
+\r
+  @param[in] CapsuleHeader  Points to a capsule header.\r
+  @param[in] CapsuleSize    Size of the whole capsule image.\r
+\r
+**/\r
+BOOLEAN\r
+IsValidCapsuleHeader (\r
+  IN EFI_CAPSULE_HEADER     *CapsuleHeader,\r
+  IN UINT64                 CapsuleSize\r
+  );\r
+\r
 /**\r
   Dump UX capsule information.\r
 \r
@@ -248,6 +266,11 @@ DumpCapsule (
     Print(L"CapsuleApp: Capsule (%s) is not found.\n", CapsuleName);\r
     goto Done;\r
   }\r
+  if (!IsValidCapsuleHeader (Buffer, FileSize)) {\r
+    Print(L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName);\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
+  }\r
 \r
   CapsuleHeader = Buffer;\r
   if (CompareGuid(&CapsuleHeader->CapsuleGuid, &gWindowsUxCapsuleGuid)) {\r