#include <Library/PrintLib.h>\r
#include <Library/BmpSupportLib.h>\r
#include <Protocol/GraphicsOutput.h>\r
-#include <Guid/GlobalVariable.h>\r
#include <Guid/CapsuleReport.h>\r
#include <Guid/SystemResourceTable.h>\r
#include <Guid/FmpCapsule.h>\r
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
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
}\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