mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-11-03 21:17:23 +01:00 
			
		
		
		
	BaseTools/EfiRom: Fix potential memory leak
Cc: Liming Gao <liming.gao@intel.com> Cc: Yonghong Zhu <yonghong.zhu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
		
							parent
							
								
									aee346514d
								
							
						
					
					
						commit
						fb4ea38c46
					
				@ -883,9 +883,11 @@ Returns:
 | 
				
			|||||||
  UINT32    ClassCode;
 | 
					  UINT32    ClassCode;
 | 
				
			||||||
  UINT32    CodeRevision;
 | 
					  UINT32    CodeRevision;
 | 
				
			||||||
  EFI_STATUS Status;
 | 
					  EFI_STATUS Status;
 | 
				
			||||||
 | 
					  INTN       ReturnStatus;
 | 
				
			||||||
  BOOLEAN    EfiRomFlag;
 | 
					  BOOLEAN    EfiRomFlag;
 | 
				
			||||||
  UINT64     TempValue;
 | 
					  UINT64     TempValue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ReturnStatus = 0;
 | 
				
			||||||
  FileFlags = 0;
 | 
					  FileFlags = 0;
 | 
				
			||||||
  EfiRomFlag = FALSE;
 | 
					  EfiRomFlag = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -940,11 +942,13 @@ Returns:
 | 
				
			|||||||
        Status = AsciiStringToUint64(Argv[1], FALSE, &TempValue);
 | 
					        Status = AsciiStringToUint64(Argv[1], FALSE, &TempValue);
 | 
				
			||||||
        if (EFI_ERROR (Status)) {
 | 
					        if (EFI_ERROR (Status)) {
 | 
				
			||||||
          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);
 | 
					          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);
 | 
				
			||||||
          return 1;
 | 
					          ReturnStatus = 1;
 | 
				
			||||||
 | 
					          goto Done;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (TempValue >= 0x10000) {
 | 
					        if (TempValue >= 0x10000) {
 | 
				
			||||||
          Error (NULL, 0, 2000, "Invalid option value", "Vendor Id %s out of range!", Argv[1]);
 | 
					          Error (NULL, 0, 2000, "Invalid option value", "Vendor Id %s out of range!", Argv[1]);
 | 
				
			||||||
          return 1;
 | 
					          ReturnStatus = 1;
 | 
				
			||||||
 | 
					          goto Done;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Options->VendId       = (UINT16) TempValue;
 | 
					        Options->VendId       = (UINT16) TempValue;
 | 
				
			||||||
        Options->VendIdValid  = 1;
 | 
					        Options->VendIdValid  = 1;
 | 
				
			||||||
@ -959,11 +963,13 @@ Returns:
 | 
				
			|||||||
        Status = AsciiStringToUint64(Argv[1], FALSE, &TempValue);
 | 
					        Status = AsciiStringToUint64(Argv[1], FALSE, &TempValue);
 | 
				
			||||||
        if (EFI_ERROR (Status)) {
 | 
					        if (EFI_ERROR (Status)) {
 | 
				
			||||||
          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);
 | 
					          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);
 | 
				
			||||||
          return 1;
 | 
					          ReturnStatus = 1;
 | 
				
			||||||
 | 
					          goto Done;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (TempValue >= 0x10000) {
 | 
					        if (TempValue >= 0x10000) {
 | 
				
			||||||
          Error (NULL, 0, 2000, "Invalid option value", "Device Id %s out of range!", Argv[1]);
 | 
					          Error (NULL, 0, 2000, "Invalid option value", "Device Id %s out of range!", Argv[1]);
 | 
				
			||||||
          return 1;
 | 
					          ReturnStatus = 1;
 | 
				
			||||||
 | 
					          goto Done;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        Options->DevId      = (UINT16) TempValue;
 | 
					        Options->DevId      = (UINT16) TempValue;
 | 
				
			||||||
        Options->DevIdValid = 1;
 | 
					        Options->DevIdValid = 1;
 | 
				
			||||||
@ -977,11 +983,13 @@ Returns:
 | 
				
			|||||||
        //
 | 
					        //
 | 
				
			||||||
        if (Argv[1] == NULL || Argv[1][0] == '-') {
 | 
					        if (Argv[1] == NULL || Argv[1][0] == '-') {
 | 
				
			||||||
          Error (NULL, 0, 2000, "Invalid parameter", "Missing output file name with %s option!", Argv[0]);
 | 
					          Error (NULL, 0, 2000, "Invalid parameter", "Missing output file name with %s option!", Argv[0]);
 | 
				
			||||||
          return STATUS_ERROR;
 | 
					          ReturnStatus = STATUS_ERROR;
 | 
				
			||||||
 | 
					          goto Done;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (strlen (Argv[1]) > MAX_PATH - 1) {
 | 
					        if (strlen (Argv[1]) > MAX_PATH - 1) {
 | 
				
			||||||
          Error (NULL, 0, 2000, "Invalid parameter", "Output file name %s is too long!", Argv[1]);
 | 
					          Error (NULL, 0, 2000, "Invalid parameter", "Output file name %s is too long!", Argv[1]);
 | 
				
			||||||
          return STATUS_ERROR;
 | 
					          ReturnStatus = STATUS_ERROR;
 | 
				
			||||||
 | 
					          goto Done;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        strncpy (Options->OutFileName, Argv[1], MAX_PATH - 1);
 | 
					        strncpy (Options->OutFileName, Argv[1], MAX_PATH - 1);
 | 
				
			||||||
        Options->OutFileName[MAX_PATH - 1] = 0;
 | 
					        Options->OutFileName[MAX_PATH - 1] = 0;
 | 
				
			||||||
@ -993,7 +1001,8 @@ Returns:
 | 
				
			|||||||
        // Help option
 | 
					        // Help option
 | 
				
			||||||
        //
 | 
					        //
 | 
				
			||||||
        Usage ();
 | 
					        Usage ();
 | 
				
			||||||
        return STATUS_ERROR;
 | 
					        ReturnStatus = STATUS_ERROR;
 | 
				
			||||||
 | 
					        goto Done;
 | 
				
			||||||
      } else if (stricmp (Argv[0], "-b") == 0) {
 | 
					      } else if (stricmp (Argv[0], "-b") == 0) {
 | 
				
			||||||
        //
 | 
					        //
 | 
				
			||||||
        // Specify binary files with -b
 | 
					        // Specify binary files with -b
 | 
				
			||||||
@ -1021,11 +1030,13 @@ Returns:
 | 
				
			|||||||
        Status = AsciiStringToUint64(Argv[1], FALSE, &DebugLevel);
 | 
					        Status = AsciiStringToUint64(Argv[1], FALSE, &DebugLevel);
 | 
				
			||||||
        if (EFI_ERROR (Status)) {
 | 
					        if (EFI_ERROR (Status)) {
 | 
				
			||||||
          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);
 | 
					          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);
 | 
				
			||||||
          return 1;
 | 
					          ReturnStatus = 1;
 | 
				
			||||||
 | 
					          goto Done;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (DebugLevel > 9)  {
 | 
					        if (DebugLevel > 9)  {
 | 
				
			||||||
          Error (NULL, 0, 2000, "Invalid option value", "Debug Level range is 0-9, current input level is %d", Argv[1]);
 | 
					          Error (NULL, 0, 2000, "Invalid option value", "Debug Level range is 0-9, current input level is %d", Argv[1]);
 | 
				
			||||||
          return 1;
 | 
					          ReturnStatus = 1;
 | 
				
			||||||
 | 
					          goto Done;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (DebugLevel>=5 && DebugLevel<=9) {
 | 
					        if (DebugLevel>=5 && DebugLevel<=9) {
 | 
				
			||||||
          Options->Debug = TRUE;
 | 
					          Options->Debug = TRUE;
 | 
				
			||||||
@ -1055,12 +1066,14 @@ Returns:
 | 
				
			|||||||
        Status = AsciiStringToUint64(Argv[1], FALSE, &TempValue);
 | 
					        Status = AsciiStringToUint64(Argv[1], FALSE, &TempValue);
 | 
				
			||||||
        if (EFI_ERROR (Status)) {
 | 
					        if (EFI_ERROR (Status)) {
 | 
				
			||||||
          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);
 | 
					          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);
 | 
				
			||||||
          return 1;
 | 
					          ReturnStatus = 1;
 | 
				
			||||||
 | 
					          goto Done;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ClassCode = (UINT32) TempValue;
 | 
					        ClassCode = (UINT32) TempValue;
 | 
				
			||||||
        if (ClassCode & 0xFF000000) {
 | 
					        if (ClassCode & 0xFF000000) {
 | 
				
			||||||
          Error (NULL, 0, 2000, "Invalid parameter", "Class code %s out of range!", Argv[1]);
 | 
					          Error (NULL, 0, 2000, "Invalid parameter", "Class code %s out of range!", Argv[1]);
 | 
				
			||||||
          return STATUS_ERROR;
 | 
					          ReturnStatus = STATUS_ERROR;
 | 
				
			||||||
 | 
					          goto Done;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (FileList != NULL && FileList->ClassCode == 0) {
 | 
					        if (FileList != NULL && FileList->ClassCode == 0) {
 | 
				
			||||||
          FileList->ClassCode = ClassCode;
 | 
					          FileList->ClassCode = ClassCode;
 | 
				
			||||||
@ -1076,12 +1089,14 @@ Returns:
 | 
				
			|||||||
        Status = AsciiStringToUint64(Argv[1], FALSE, &TempValue);
 | 
					        Status = AsciiStringToUint64(Argv[1], FALSE, &TempValue);
 | 
				
			||||||
        if (EFI_ERROR (Status)) {
 | 
					        if (EFI_ERROR (Status)) {
 | 
				
			||||||
          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);
 | 
					          Error (NULL, 0, 2000, "Invalid option value", "%s = %s", Argv[0], Argv[1]);
 | 
				
			||||||
          return 1;
 | 
					          ReturnStatus = 1;
 | 
				
			||||||
 | 
					          goto Done;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        CodeRevision = (UINT32) TempValue;
 | 
					        CodeRevision = (UINT32) TempValue;
 | 
				
			||||||
        if (CodeRevision & 0xFFFF0000) {
 | 
					        if (CodeRevision & 0xFFFF0000) {
 | 
				
			||||||
          Error (NULL, 0, 2000, "Invalid parameter", "Code revision %s out of range!", Argv[1]);
 | 
					          Error (NULL, 0, 2000, "Invalid parameter", "Code revision %s out of range!", Argv[1]);
 | 
				
			||||||
          return STATUS_ERROR;
 | 
					          ReturnStatus = STATUS_ERROR;
 | 
				
			||||||
 | 
					          goto Done;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (FileList != NULL && FileList->CodeRevision == 0) {
 | 
					        if (FileList != NULL && FileList->CodeRevision == 0) {
 | 
				
			||||||
          FileList->CodeRevision = (UINT16) CodeRevision;
 | 
					          FileList->CodeRevision = (UINT16) CodeRevision;
 | 
				
			||||||
@ -1095,7 +1110,8 @@ Returns:
 | 
				
			|||||||
        mOptions.Pci23 = 1;
 | 
					        mOptions.Pci23 = 1;
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        Error (NULL, 0, 2000, "Invalid parameter", "Invalid option specified: %s", Argv[0]);
 | 
					        Error (NULL, 0, 2000, "Invalid parameter", "Invalid option specified: %s", Argv[0]);
 | 
				
			||||||
        return STATUS_ERROR;
 | 
					        ReturnStatus = STATUS_ERROR;
 | 
				
			||||||
 | 
					        goto Done;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      //
 | 
					      //
 | 
				
			||||||
@ -1104,7 +1120,8 @@ Returns:
 | 
				
			|||||||
      //
 | 
					      //
 | 
				
			||||||
      if ((FileFlags & (FILE_FLAG_BINARY | FILE_FLAG_EFI)) == 0) {
 | 
					      if ((FileFlags & (FILE_FLAG_BINARY | FILE_FLAG_EFI)) == 0) {
 | 
				
			||||||
        Error (NULL, 0, 2000, "Invalid parameter", "Missing -e or -b with input file %s!", Argv[0]);
 | 
					        Error (NULL, 0, 2000, "Invalid parameter", "Missing -e or -b with input file %s!", Argv[0]);
 | 
				
			||||||
        return STATUS_ERROR;
 | 
					        ReturnStatus = STATUS_ERROR;
 | 
				
			||||||
 | 
					        goto Done;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      //
 | 
					      //
 | 
				
			||||||
      // Check Efi Option RomImage
 | 
					      // Check Efi Option RomImage
 | 
				
			||||||
@ -1118,7 +1135,8 @@ Returns:
 | 
				
			|||||||
      FileList = (FILE_LIST *) malloc (sizeof (FILE_LIST));
 | 
					      FileList = (FILE_LIST *) malloc (sizeof (FILE_LIST));
 | 
				
			||||||
      if (FileList == NULL) {
 | 
					      if (FileList == NULL) {
 | 
				
			||||||
        Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!", NULL);
 | 
					        Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!", NULL);
 | 
				
			||||||
        return STATUS_ERROR;
 | 
					        ReturnStatus = STATUS_ERROR;
 | 
				
			||||||
 | 
					        goto Done;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
      //
 | 
					      //
 | 
				
			||||||
@ -1156,6 +1174,9 @@ Returns:
 | 
				
			|||||||
  //
 | 
					  //
 | 
				
			||||||
  if (Options->FileList == NULL) {
 | 
					  if (Options->FileList == NULL) {
 | 
				
			||||||
    Error (NULL, 0, 2000, "Invalid parameter", "Missing input file name!");
 | 
					    Error (NULL, 0, 2000, "Invalid parameter", "Missing input file name!");
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    // No memory allocation, return directly.
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
    return STATUS_ERROR;
 | 
					    return STATUS_ERROR;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1165,16 +1186,27 @@ Returns:
 | 
				
			|||||||
  if (EfiRomFlag) {
 | 
					  if (EfiRomFlag) {
 | 
				
			||||||
    if (!Options->VendIdValid) {
 | 
					    if (!Options->VendIdValid) {
 | 
				
			||||||
      Error (NULL, 0, 2000, "Missing Vendor ID in command line", NULL);
 | 
					      Error (NULL, 0, 2000, "Missing Vendor ID in command line", NULL);
 | 
				
			||||||
      return STATUS_ERROR;
 | 
					      ReturnStatus = STATUS_ERROR;
 | 
				
			||||||
 | 
					      goto Done;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
    if (!Options->DevIdValid) {
 | 
					    if (!Options->DevIdValid) {
 | 
				
			||||||
      Error (NULL, 0, 2000, "Missing Device ID in command line", NULL);
 | 
					      Error (NULL, 0, 2000, "Missing Device ID in command line", NULL);
 | 
				
			||||||
      return STATUS_ERROR;
 | 
					      ReturnStatus = STATUS_ERROR;
 | 
				
			||||||
 | 
					      goto Done;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return 0;
 | 
					Done:
 | 
				
			||||||
 | 
					  if (ReturnStatus != 0) {
 | 
				
			||||||
 | 
					    while (Options->FileList != NULL) {
 | 
				
			||||||
 | 
					      FileList = Options->FileList->Next;
 | 
				
			||||||
 | 
					      free (Options->FileList);
 | 
				
			||||||
 | 
					      Options->FileList = FileList;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return ReturnStatus;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static
 | 
					static
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user