/** @file\r
The tool dumps the contents of a firmware volume\r
\r
-Copyright (c) 1999 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 1999 - 2017, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
VOID\r
);\r
\r
+UINT32\r
+UnicodeStrLen (\r
+ IN CHAR16 *String\r
+ )\r
+ /*++\r
+\r
+ Routine Description:\r
+\r
+ Returns the length of a null-terminated unicode string.\r
+\r
+ Arguments:\r
+\r
+ String - The pointer to a null-terminated unicode string.\r
+\r
+ Returns:\r
+\r
+ N/A\r
+\r
+ --*/\r
+{\r
+ UINT32 Length;\r
+\r
+ for (Length = 0; *String != L'\0'; String++, Length++) {\r
+ ;\r
+ }\r
+ return Length;\r
+}\r
+\r
+VOID\r
+Unicode2AsciiString (\r
+ IN CHAR16 *Source,\r
+ OUT CHAR8 *Destination\r
+ )\r
+ /*++\r
+\r
+ Routine Description:\r
+\r
+ Convert a null-terminated unicode string to a null-terminated ascii string.\r
+\r
+ Arguments:\r
+\r
+ Source - The pointer to the null-terminated input unicode string.\r
+ Destination - The pointer to the null-terminated output ascii string.\r
+\r
+ Returns:\r
+\r
+ N/A\r
+\r
+ --*/\r
+{\r
+ while (*Source != '\0') {\r
+ *(Destination++) = (CHAR8) *(Source++);\r
+ }\r
+ //\r
+ // End the ascii with a NULL.\r
+ //\r
+ *Destination = '\0';\r
+}\r
+\r
int\r
main (\r
int argc,\r
continue;\r
}\r
if ((stricmp (argv[0], "--hash") == 0)) {\r
+ if (EnableHash == TRUE) {\r
+ //\r
+ // --hash already given in the option, ignore this one\r
+ //\r
+ argc --;\r
+ argv ++;\r
+ continue;\r
+ }\r
EnableHash = TRUE;\r
OpenSslCommand = "openssl";\r
OpenSslEnv = getenv("OPENSSL_PATH");\r
OpenSslPath = OpenSslCommand;\r
} else {\r
OpenSslPath = malloc(strlen(OpenSslEnv)+strlen(OpenSslCommand)+1);\r
+ if (OpenSslPath == NULL) {\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+ return GetUtilityStatus ();\r
+ }\r
CombinePath(OpenSslEnv, OpenSslCommand, OpenSslPath);\r
}\r
if (OpenSslPath == NULL){\r
}\r
}\r
\r
- //\r
- // No available section header is found.\r
- //\r
- if (Index == ImgHdr->Pe32.FileHeader.NumberOfSections) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
//\r
// BaseAddress is set to section header.\r
//\r
)\r
{\r
UINT32 DefaultPathLen;\r
+ UINT64 Index;\r
+\r
DefaultPathLen = strlen(DefaultPath);\r
strcpy(NewPath, DefaultPath);\r
- UINT64 Index = 0;\r
+ Index = 0;\r
for (; Index < DefaultPathLen; Index ++) {\r
if (NewPath[Index] == '\\' || NewPath[Index] == '/') {\r
if (NewPath[Index + 1] != '\0') {\r
CHAR8 *ExtractionTool;\r
CHAR8 *ToolInputFile;\r
CHAR8 *ToolOutputFile;\r
- CHAR8 *SystemCommandFormatString;\r
CHAR8 *SystemCommand;\r
EFI_GUID *EfiGuid;\r
UINT16 DataOffset;\r
UINT32 RealHdrLen;\r
CHAR8 *ToolInputFileName;\r
CHAR8 *ToolOutputFileName;\r
+ CHAR8 *UIFileName;\r
\r
ParsedLength = 0;\r
ToolInputFileName = NULL;\r
SectionHeaderLen = GetSectionHeaderLength((EFI_COMMON_SECTION_HEADER *)Ptr);\r
\r
SectionName = SectionNameToStr (Type);\r
- printf ("------------------------------------------------------------\n");\r
- printf (" Type: %s\n Size: 0x%08X\n", SectionName, (unsigned) SectionLength);\r
- free (SectionName);\r
+ if (SectionName != NULL) {\r
+ printf ("------------------------------------------------------------\n");\r
+ printf (" Type: %s\n Size: 0x%08X\n", SectionName, (unsigned) SectionLength);\r
+ free (SectionName);\r
+ }\r
\r
switch (Type) {\r
case EFI_SECTION_RAW:\r
SectionLength - SectionHeaderLen\r
);\r
\r
- SystemCommandFormatString = "%s sha1 -out %s %s";\r
SystemCommand = malloc (\r
- strlen (SystemCommandFormatString) +\r
+ strlen (OPENSSL_COMMAND_FORMAT_STRING) +\r
strlen (OpenSslPath) +\r
strlen (ToolInputFileName) +\r
strlen (ToolOutputFileName) +\r
1\r
);\r
+ if (SystemCommand == NULL) {\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
sprintf (\r
SystemCommand,\r
- SystemCommandFormatString,\r
+ OPENSSL_COMMAND_FORMAT_STRING,\r
OpenSslPath,\r
ToolOutputFileName,\r
ToolInputFileName\r
nFileLen = ftell(fp);\r
fseek(fp,0,SEEK_SET);\r
StrLine = malloc(nFileLen);\r
+ if (StrLine == NULL) {\r
+ fclose(fp);\r
+ free (SystemCommand);\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
fgets(StrLine, nFileLen, fp);\r
NewStr = strrchr (StrLine, '=');\r
printf (" SHA1: %s\n", NewStr + 1);\r
free (StrLine);\r
+ fclose(fp);\r
}\r
- fclose(fp);\r
}\r
remove(ToolInputFileName);\r
remove(ToolOutputFileName);\r
break;\r
\r
case EFI_SECTION_USER_INTERFACE:\r
- printf (" String: %ls\n", (CHAR16 *) &((EFI_USER_INTERFACE_SECTION *) Ptr)->FileNameString);\r
+ UIFileName = (CHAR8 *) malloc (UnicodeStrLen (((EFI_USER_INTERFACE_SECTION *) Ptr)->FileNameString) + 1);\r
+ if (UIFileName == NULL) {\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ Unicode2AsciiString (((EFI_USER_INTERFACE_SECTION *) Ptr)->FileNameString, UIFileName);\r
+ printf (" String: %s\n", UIFileName);\r
+ free (UIFileName);\r
break;\r
\r
case EFI_SECTION_FIRMWARE_VOLUME_IMAGE:\r
}\r
\r
ScratchBuffer = malloc (ScratchSize);\r
+ if (ScratchBuffer == NULL) {\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
UncompressedBuffer = malloc (UncompressedLength);\r
- if ((ScratchBuffer == NULL) || (UncompressedBuffer == NULL)) {\r
+ if (UncompressedBuffer == NULL) {\r
+ free (ScratchBuffer);\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
return EFI_OUT_OF_RESOURCES;\r
}\r
Status = DecompressFunction (\r
close(fd2);\r
#endif\r
\r
+ if ((ToolInputFile == NULL) || (ToolOutputFile == NULL)) {\r
+ if (ToolInputFile != NULL) {\r
+ free (ToolInputFile);\r
+ }\r
+ if (ToolOutputFile != NULL) {\r
+ free (ToolOutputFile);\r
+ }\r
+ free (ExtractionTool);\r
+\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
//\r
// Construction 'system' command string\r
//\r
- SystemCommandFormatString = "%s -d -o %s %s";\r
SystemCommand = malloc (\r
- strlen (SystemCommandFormatString) +\r
+ strlen (EXTRACT_COMMAND_FORMAT_STRING) +\r
strlen (ExtractionTool) +\r
strlen (ToolInputFile) +\r
strlen (ToolOutputFile) +\r
1\r
);\r
+ if (SystemCommand == NULL) {\r
+ free (ToolInputFile);\r
+ free (ToolOutputFile);\r
+ free (ExtractionTool);\r
+\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
sprintf (\r
SystemCommand,\r
- SystemCommandFormatString,\r
+ EXTRACT_COMMAND_FORMAT_STRING,\r
ExtractionTool,\r
ToolOutputFile,\r
ToolInputFile\r
);\r
remove (ToolOutputFile);\r
free (ToolOutputFile);\r
+ free (SystemCommand);\r
if (EFI_ERROR (Status)) {\r
Error (NULL, 0, 0004, "unable to read decoded GUIDED section", NULL);\r
return EFI_SECTION_ERROR;\r
{\r
FILE *Fptr;\r
CHAR8 Line[MAX_LINE_LEN];\r
+ CHAR8 FormatString[MAX_LINE_LEN];\r
GUID_TO_BASENAME *GPtr;\r
\r
if ((Fptr = fopen (LongFilePath (FileName), "r")) == NULL) {\r
return EFI_DEVICE_ERROR;\r
}\r
\r
+ //\r
+ // Generate the format string for fscanf\r
+ //\r
+ sprintf (\r
+ FormatString,\r
+ "%%%us %%%us",\r
+ (unsigned) sizeof (GPtr->Guid) - 1,\r
+ (unsigned) sizeof (GPtr->BaseName) - 1\r
+ );\r
+\r
while (fgets (Line, sizeof (Line), Fptr) != NULL) {\r
//\r
// Allocate space for another guid/basename element\r
//\r
GPtr = malloc (sizeof (GUID_TO_BASENAME));\r
if (GPtr == NULL) {\r
+ fclose (Fptr);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
memset ((char *) GPtr, 0, sizeof (GUID_TO_BASENAME));\r
- if (sscanf (Line, "%s %s", GPtr->Guid, GPtr->BaseName) == 2) {\r
+ if (sscanf (Line, FormatString, GPtr->Guid, GPtr->BaseName) == 2) {\r
GPtr->Next = mGuidBaseNameList;\r
mGuidBaseNameList = GPtr;\r
} else {\r