This file contains functions required to generate a boot strap file (BSF) also \r
known as the Volume Top File (VTF)\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 are licensed and made available \r
under the terms and conditions of the BSD License which accompanies this \r
distribution. The full text of the license may be found at\r
--*/\r
{\r
CHAR8 TemStr[5] = "0000";\r
- unsigned Major;\r
- unsigned Minor;\r
+ int Major;\r
+ int Minor;\r
UINTN Length;\r
\r
Major = 0;\r
} else {\r
Length = strlen(Str);\r
if (Length < 4) {\r
- strncpy (TemStr + 4 - Length, Str, Length);\r
+ memcpy (TemStr + 4 - Length, Str, Length);\r
} else {\r
- strncpy (TemStr, Str + Length - 4, 4);\r
+ memcpy (TemStr, Str + Length - 4, 4);\r
}\r
\r
sscanf (\r
}\r
} else if (strnicmp (*TokenStr, "COMP_BIN", 8) == 0) {\r
TokenStr++;\r
- strcpy (VtfInfo->CompBinName, *TokenStr);\r
+ if (strlen (*TokenStr) >= FILE_NAME_SIZE) {\r
+ Error (NULL, 0, 3000, "Invalid", "The 'COMP_BIN' name is too long.");\r
+ return ;\r
+ }\r
+ strncpy (VtfInfo->CompBinName, *TokenStr, FILE_NAME_SIZE - 1);\r
+ VtfInfo->CompBinName[FILE_NAME_SIZE - 1] = 0;\r
} else if (strnicmp (*TokenStr, "COMP_SYM", 8) == 0) {\r
TokenStr++;\r
- strcpy (VtfInfo->CompSymName, *TokenStr);\r
+ if (strlen (*TokenStr) >= FILE_NAME_SIZE) {\r
+ Error (NULL, 0, 3000, "Invalid", "The 'COMP_SYM' name is too long.");\r
+ return ;\r
+ }\r
+ strncpy (VtfInfo->CompSymName, *TokenStr, FILE_NAME_SIZE - 1);\r
+ VtfInfo->CompSymName[FILE_NAME_SIZE - 1] = 0;\r
} else if (strnicmp (*TokenStr, "COMP_SIZE", 9) == 0) {\r
TokenStr++;\r
if (strnicmp (*TokenStr, "-", 1) == 0) {\r
if (SectionOptionFlag) {\r
if (stricmp (*TokenStr, "IA32_RST_BIN") == 0) {\r
TokenStr++;\r
- strcpy (IA32BinFile, *TokenStr);\r
+ if (strlen (*TokenStr) >= FILE_NAME_SIZE) {\r
+ Error (NULL, 0, 3000, "Invalid", "The 'IA32_RST_BIN' name is too long.");\r
+ break;\r
+ }\r
+ strncpy (IA32BinFile, *TokenStr, FILE_NAME_SIZE - 1);\r
+ IA32BinFile[FILE_NAME_SIZE - 1] = 0;\r
}\r
}\r
\r
if (SectionCompFlag) {\r
if (stricmp (*TokenStr, "COMP_NAME") == 0) {\r
TokenStr++;\r
- strcpy (FileListPtr->CompName, *TokenStr);\r
+ if (strlen (*TokenStr) >= COMPONENT_NAME_SIZE) {\r
+ Error (NULL, 0, 3000, "Invalid", "The 'COMP_NAME' name is too long.");\r
+ break;\r
+ }\r
+ strncpy (FileListPtr->CompName, *TokenStr, COMPONENT_NAME_SIZE - 1);\r
+ FileListPtr->CompName[COMPONENT_NAME_SIZE - 1] = 0;\r
TokenStr++;\r
ParseAndUpdateComponents (FileListPtr);\r
}\r
CHAR8 Buff4[10];\r
CHAR8 Buff5[10];\r
CHAR8 Token[50];\r
+ CHAR8 FormatString[MAX_LINE_LEN];\r
\r
Fp = fopen (LongFilePath (VtfInfo->CompSymName), "rb");\r
\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ //\r
+ // Generate the format string for fscanf\r
+ //\r
+ sprintf (\r
+ FormatString,\r
+ "%%%us %%%us %%%us %%%us %%%us %%%us %%%us",\r
+ (unsigned) sizeof (Buff1) - 1,\r
+ (unsigned) sizeof (Buff2) - 1,\r
+ (unsigned) sizeof (OffsetStr) - 1,\r
+ (unsigned) sizeof (Buff3) - 1,\r
+ (unsigned) sizeof (Buff4) - 1,\r
+ (unsigned) sizeof (Buff5) - 1,\r
+ (unsigned) sizeof (Token) - 1\r
+ );\r
+\r
while (fgets (Buff, sizeof (Buff), Fp) != NULL) {\r
fscanf (\r
Fp,\r
- "%s %s %s %s %s %s %s",\r
+ FormatString,\r
Buff1,\r
Buff2,\r
OffsetStr,\r
EFI_ABORTED - Aborted due to one of the many reasons like:\r
(a) Component Size greater than the specified size.\r
(b) Error opening files.\r
+ (c) Fail to get the FIT table address.\r
\r
EFI_INVALID_PARAMETER Value returned from call to UpdateEntryPoint()\r
EFI_OUT_OF_RESOURCES Memory allocation failure.\r
\r
if (VtfInfo->PreferredSize) {\r
if (FileSize > VtfInfo->CompSize) {\r
+ fclose (Fp);\r
Error (NULL, 0, 2000, "Invalid parameter", "The component size is more than specified size.");\r
return EFI_ABORTED;\r
}\r
\r
Buffer = malloc ((UINTN) FileSize);\r
if (Buffer == NULL) {\r
+ fclose (Fp);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
memset (Buffer, 0, (UINTN) FileSize);\r
Vtf1TotalSize += (UINT32) (FileSize + NumAdjustByte);\r
Status = UpdateVtfBuffer (CompStartAddress, Buffer, FileSize, FIRST_VTF);\r
} else {\r
+ free (Buffer);\r
Error (NULL, 0, 2000,"Invalid Parameter", "There's component in second VTF so second BaseAddress and Size must be specified!");\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
if (EFI_ERROR (Status)) {\r
+ free (Buffer);\r
return EFI_ABORTED;\r
}\r
\r
GetNextAvailableFitPtr (&CompFitPtr);\r
+ if (CompFitPtr == NULL) {\r
+ free (Buffer);\r
+ return EFI_ABORTED;\r
+ }\r
\r
CompFitPtr->CompAddress = CompStartAddress | IPF_CACHE_BIT;\r
if ((FileSize % 16) != 0) {\r
+ free (Buffer);\r
Error (NULL, 0, 2000, "Invalid parameter", "Binary FileSize must be a multiple of 16.");\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
FileSize = _filelength (fileno (Fp));\r
if (FileSize < 64) {\r
+ fclose (Fp);\r
Error (NULL, 0, 2000, "Invalid parameter", "PAL_A bin header is 64 bytes, so the Bin size must be larger than 64 bytes!");\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
if (VtfInfo->PreferredSize) {\r
if (FileSize > VtfInfo->CompSize) {\r
+ fclose (Fp);\r
Error (NULL, 0, 2000, "Invalid parameter", "The PAL_A Size is more than the specified size.");\r
return EFI_ABORTED;\r
}\r
\r
Buffer = malloc ((UINTN) FileSize);\r
if (Buffer == NULL) {\r
+ fclose (Fp);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
memset (Buffer, 0, (UINTN) FileSize);\r
PalFitPtr->CompAddress = PalStartAddress | IPF_CACHE_BIT;\r
//assert ((FileSize % 16) == 0);\r
if ((FileSize % 16) != 0) {\r
+ free (Buffer);\r
Error (NULL, 0, 2000, "Invalid parameter", "Binary FileSize must be a multiple of 16.");\r
return EFI_INVALID_PARAMETER;\r
}\r
FileSize = _filelength (fileno (Fp));\r
\r
if (FileSize > 16) {\r
+ fclose (Fp);\r
return EFI_ABORTED;\r
}\r
\r
Buffer = malloc (FileSize);\r
if (Buffer == NULL) {\r
+ fclose (Fp);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
CHAR8 Section[MAX_LONG_FILE_PATH];\r
CHAR8 Token[MAX_LONG_FILE_PATH];\r
CHAR8 BaseToken[MAX_LONG_FILE_PATH];\r
+ CHAR8 FormatString[MAX_LINE_LEN];\r
UINT64 TokenAddress;\r
long StartLocation;\r
\r
//\r
// Use the file name minus extension as the base for tokens\r
//\r
- strcpy (BaseToken, SourceFileName);\r
+ if (strlen (SourceFileName) >= MAX_LONG_FILE_PATH) {\r
+ fclose (SourceFile);\r
+ Error (NULL, 0, 2000, "Invalid parameter", "The source file name is too long.");\r
+ return EFI_ABORTED;\r
+ }\r
+ strncpy (BaseToken, SourceFileName, MAX_LONG_FILE_PATH - 1);\r
+ BaseToken[MAX_LONG_FILE_PATH - 1] = 0;\r
strtok (BaseToken, ". \t\n");\r
- strcat (BaseToken, "__");\r
+ if (strlen (BaseToken) + strlen ("__") >= MAX_LONG_FILE_PATH) {\r
+ fclose (SourceFile);\r
+ Error (NULL, 0, 2000, "Invalid parameter", "The source file name is too long.");\r
+ return EFI_ABORTED;\r
+ }\r
+ strncat (BaseToken, "__", MAX_LONG_FILE_PATH - strlen (BaseToken) - 1);\r
\r
//\r
// Open the destination file\r
return EFI_ABORTED;\r
}\r
\r
+ //\r
+ // Generate the format string for fscanf\r
+ //\r
+ sprintf (\r
+ FormatString,\r
+ "%%%us | %%%us | %%%us | %%%us\n",\r
+ (unsigned) sizeof (Type) - 1,\r
+ (unsigned) sizeof (Address) - 1,\r
+ (unsigned) sizeof (Section) - 1,\r
+ (unsigned) sizeof (Token) - 1\r
+ );\r
+\r
//\r
// Read in the file\r
//\r
//\r
// Read a line\r
//\r
- if (fscanf (SourceFile, "%s | %s | %s | %s\n", Type, Address, Section, Token) == 4) {\r
+ if (fscanf (SourceFile, FormatString, Type, Address, Section, Token) == 4) {\r
\r
//\r
// Get the token address\r
// Get the input VTF file name\r
//\r
VtfFileName = argv[Index+1];\r
+ if (VtfFP != NULL) {\r
+ //\r
+ // VTF file name has been given previously, override with the new value\r
+ //\r
+ fclose (VtfFP);\r
+ }\r
VtfFP = fopen (LongFilePath (VtfFileName), "rb");\r
if (VtfFP == NULL) {\r
Error (NULL, 0, 0001, "Error opening file", VtfFileName);\r
}\r
SymFileName = VTF_SYM_FILE;\r
} else {\r
- INTN OutFileNameLen = strlen(OutFileName1);\r
+ INTN OutFileNameLen;\r
INTN NewIndex;\r
\r
+ assert (OutFileName1);\r
+ OutFileNameLen = strlen(OutFileName1);\r
+\r
for (NewIndex = OutFileNameLen; NewIndex > 0; --NewIndex) {\r
if (OutFileName1[NewIndex] == '/' || OutFileName1[NewIndex] == '\\') {\r
break;\r
} else {\r
INTN SymFileNameLen = NewIndex + 1 + strlen(VTF_SYM_FILE);\r
SymFileName = malloc(SymFileNameLen + 1);\r
+ if (SymFileName == NULL) {\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+ goto ERROR;\r
+ }\r
memcpy(SymFileName, OutFileName1, NewIndex + 1);\r
memcpy(SymFileName + NewIndex + 1, VTF_SYM_FILE, strlen(VTF_SYM_FILE));\r
SymFileName[SymFileNameLen] = '\0';\r