// VerticalResolution >= BMP_IMAGE_HEADER.PixelHeight\r
\r
if (Argc != 5) {\r
- Print(L"CapsuleApp: Invalid Parameter.\n");\r
+ Print(L"CapsuleApp: Incorrect parameter count.\n");\r
return EFI_UNSUPPORTED;\r
}\r
\r
EFI_STATUS Status;\r
\r
if (Argc != 5) {\r
- Print(L"CapsuleApp: Invalid Parameter.\n");\r
+ Print(L"CapsuleApp: Incorrect parameter count.\n");\r
return EFI_UNSUPPORTED;\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
Print(L" -E: Dump UEFI ESRT table info.\n");\r
Print(L" -G: Convert a BMP file to be an UX capsule,\n");\r
Print(L" according to Windows Firmware Update document\n");\r
- Print(L" -N: Append a Capsule Header to an existing capsule image,\n");\r
+ Print(L" -N: Append a Capsule Header to an existing FMP capsule image\n");\r
+ Print(L" with its ImageTypeId supported by the system,\n");\r
Print(L" according to Windows Firmware Update document\n");\r
Print(L" -O: Output new Capsule file name\n");\r
Print(L" -D: Dump Capsule image header information, image payload information if it is an UX capsule\n");\r
@param[in] SystemTable The system table.\r
\r
@retval EFI_SUCCESS Command completed successfully.\r
- @retval EFI_INVALID_PARAMETER Command usage error.\r
+ @retval EFI_UNSUPPORTED Command usage unsupported.\r
+ @retval EFI_INVALID_PARAMETER Command usage invalid.\r
@retval EFI_NOT_FOUND The input file can't be found.\r
**/\r
EFI_STATUS\r
UINTN FileSize[MAX_CAPSULE_NUM];\r
VOID *CapsuleBuffer[MAX_CAPSULE_NUM];\r
EFI_CAPSULE_BLOCK_DESCRIPTOR *BlockDescriptors;\r
- EFI_CAPSULE_HEADER *CapsuleHeaderArray[MAX_CAPSULE_NUM + 1];\r
- UINT64 MaxCapsuleSize;\r
- EFI_RESET_TYPE ResetType;\r
- BOOLEAN NeedReset;\r
- BOOLEAN NoReset;\r
- CHAR16 *CapsuleName;\r
- UINTN CapsuleNum;\r
- UINTN Index;\r
+ EFI_CAPSULE_HEADER *CapsuleHeaderArray[MAX_CAPSULE_NUM + 1];\r
+ UINT64 MaxCapsuleSize;\r
+ EFI_RESET_TYPE ResetType;\r
+ BOOLEAN NeedReset;\r
+ BOOLEAN NoReset;\r
+ CHAR16 *CapsuleName;\r
+ UINTN CapsuleNum;\r
+ UINTN Index;\r
+ EFI_GUID ImageTypeId;\r
+ UINTN ImageIndex;\r
\r
Status = GetArg();\r
if (EFI_ERROR(Status)) {\r
}\r
if (Argc < 2) {\r
PrintUsage();\r
- return EFI_INVALID_PARAMETER;\r
+ return EFI_UNSUPPORTED;\r
}\r
if (StrCmp(Argv[1], L"-D") == 0) {\r
- if (Argc < 3) {\r
- Print(L"CapsuleApp: NO input capsule name.\n");\r
- return EFI_INVALID_PARAMETER;\r
+ if (Argc != 3) {\r
+ Print(L"CapsuleApp: Incorrect parameter count.\n");\r
+ return EFI_UNSUPPORTED;\r
}\r
Status = DumpCapsule(Argv[2]);\r
return Status;\r
return EFI_UNSUPPORTED;\r
}\r
\r
- EFI_GUID ImageTypeId;\r
- UINTN ImageIndex;\r
//\r
// FMP->GetImage()\r
//\r
Print(L"CapsuleApp: capsule image (%s) is not found.\n", CapsuleName);\r
goto Done;\r
}\r
+ if (!IsValidCapsuleHeader (CapsuleBuffer[Index], FileSize[Index])) {\r
+ Print(L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
}\r
\r
//\r