]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Nt32Pkg/MiscSubClassPlatformDxe/MiscChassisManufacturerFunction.c
MdeModulePkg: Fix use-after-free error in InstallConfigurationTable()
[mirror_edk2.git] / Nt32Pkg / MiscSubClassPlatformDxe / MiscChassisManufacturerFunction.c
index 65f72fe0ad28955578a66fbd799b41f666917dc6..c41e86aeadaae307e50846982dd9da83228265a0 100644 (file)
@@ -1,25 +1,18 @@
-/*++\r
-\r
-Copyright (c) 2009, Intel Corporation. All rights reserved. <BR> \r
-This software and associated documentation (if any) is furnished\r
-under a license and may only be used or copied in accordance\r
-with the terms of the license. Except as permitted by such\r
-license, no part of this software or documentation may be\r
-reproduced, stored in a retrieval system, or transmitted in any\r
-form or by any means without the express written consent of\r
-Intel Corporation.\r
-\r
-\r
-Module Name:\r
-\r
-  MiscChassisManufacturerFunction.c\r
-  \r
-Abstract: \r
-\r
+/** @file\r
   Chassis manufacturer information boot time changes.\r
   SMBIOS type 3.\r
+  \r
+Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2017 Hewlett Packard Enterprise Development LP<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
+http://opensource.org/licenses/bsd-license.php\r
 \r
---*/\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
 \r
 #include "MiscSubclassDriver.h"\r
 \r
@@ -39,17 +32,20 @@ MISC_SMBIOS_TABLE_FUNCTION(MiscChassisManufacturer)
   CHAR8                           *OptionalStrStart;\r
   UINTN                           ManuStrLen;\r
   UINTN                           VerStrLen;\r
-  UINTN                           AssertTagStrLen;\r
+  UINTN                           AssetTagStrLen;\r
   UINTN                           SerialNumStrLen;\r
+  UINTN                           SkuNumberStrLen;\r
   EFI_STATUS                      Status;\r
   EFI_STRING                      Manufacturer;\r
   EFI_STRING                      Version;\r
   EFI_STRING                      SerialNumber;\r
-  EFI_STRING                      AssertTag;\r
+  EFI_STRING                      AssetTag;\r
+  EFI_STRING                      SkuNumber;\r
   STRING_REF                      TokenToGet;\r
   EFI_SMBIOS_HANDLE               SmbiosHandle;\r
   SMBIOS_TABLE_TYPE3              *SmbiosRecord;\r
   EFI_MISC_CHASSIS_MANUFACTURER   *ForType3InputData;\r
+  UINT8                           *Buffer;\r
 \r
   ForType3InputData = (EFI_MISC_CHASSIS_MANUFACTURER *)RecordData;\r
 \r
@@ -82,20 +78,40 @@ MISC_SMBIOS_TABLE_FUNCTION(MiscChassisManufacturer)
   }\r
 \r
   TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_ASSET_TAG);\r
-  AssertTag = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);\r
-  AssertTagStrLen = StrLen(AssertTag);\r
-  if (AssertTagStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
+  AssetTag = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);\r
+  AssetTagStrLen = StrLen(AssetTag);\r
+  if (AssetTagStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  TokenToGet = STRING_TOKEN (STR_MISC_CHASSIS_SKU_NUMBER);\r
+  SkuNumber = HiiGetPackageString(&gEfiCallerIdGuid, TokenToGet, NULL);\r
+  SkuNumberStrLen = StrLen(SkuNumber);\r
+  if (SkuNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
   //\r
   // Two zeros following the last string.\r
   //\r
-  SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE3) + ManuStrLen + 1  + VerStrLen + 1 + SerialNumStrLen + 1 + AssertTagStrLen + 1 + 1);\r
-  ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE3) + ManuStrLen + 1  + VerStrLen + 1 + SerialNumStrLen + 1 + AssertTagStrLen + 1 + 1);\r
+  // Since we set ContainedElementCount = 0 and ContainedElementRecordLength = 0,\r
+  // remove sizeof (CONTAINED_ELEMENT) for ContainedElements[1].\r
+  //\r
+  // Add sizeof (SMBIOS_TABLE_STRING) for SKU Number, since not contained in SMBIOS_TABLE_TYPE3.\r
+  //\r
+  SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE3) - sizeof (CONTAINED_ELEMENT) + sizeof (SMBIOS_TABLE_STRING) + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssetTagStrLen + 1 + SkuNumberStrLen + 1 + 1);\r
+  ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE3) - sizeof (CONTAINED_ELEMENT) + sizeof (SMBIOS_TABLE_STRING) + ManuStrLen + 1  + VerStrLen + 1 + SerialNumStrLen + 1 + AssetTagStrLen + 1 + SkuNumberStrLen + 1 + 1);\r
+\r
+  Buffer = (UINT8 *) SmbiosRecord;\r
 \r
   SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_SYSTEM_ENCLOSURE;\r
-  SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE3);\r
+  //\r
+  // Since we set ContainedElementCount = 0 and ContainedElementRecordLength = 0,\r
+  // remove sizeof (CONTAINED_ELEMENT) for ContainedElements[1].\r
+  //\r
+  // Add sizeof (SMBIOS_TABLE_STRING) for SKU Number, since not contained in SMBIOS_TABLE_TYPE3.\r
+  //\r
+  SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE3) - sizeof (CONTAINED_ELEMENT) + sizeof (SMBIOS_TABLE_STRING);\r
   //\r
   // Make handle chosen by smbios protocol.add automatically.\r
   //\r
@@ -114,31 +130,47 @@ MISC_SMBIOS_TABLE_FUNCTION(MiscChassisManufacturer)
   //\r
   SmbiosRecord->SerialNumber = 3;  \r
   //\r
-  // AssertTag will be the 4th optional string following the formatted structure.\r
+  // AssetTag will be the 4th optional string following the formatted structure.\r
   //\r
-  SmbiosRecord->AssetTag = 4;  \r
+  SmbiosRecord->AssetTag = 4;\r
+\r
   SmbiosRecord->BootupState = (UINT8)ForType3InputData->ChassisBootupState;\r
   SmbiosRecord->PowerSupplyState = (UINT8)ForType3InputData->ChassisPowerSupplyState;\r
   SmbiosRecord->ThermalState = (UINT8)ForType3InputData->ChassisThermalState;\r
   SmbiosRecord->SecurityStatus = (UINT8)ForType3InputData->ChassisSecurityState;\r
   CopyMem (SmbiosRecord->OemDefined,(UINT8*)&ForType3InputData->ChassisOemDefined, 4);\r
+  SmbiosRecord->Height = (UINT8)ForType3InputData->ChassisHeight;\r
+  SmbiosRecord->NumberofPowerCords = (UINT8)ForType3InputData->ChassisNumberPowerCords;\r
+  SmbiosRecord->ContainedElementCount = 0;\r
+  SmbiosRecord->ContainedElementRecordLength = 0;\r
+\r
+  //\r
+  // SKU Number will be the 5th optional string following the formatted structure.\r
+  //\r
+  // Since SKU Number is not in SMBIOS_TABLE_TYPE3 structure, must locate it after ContainedElementRecordLength.\r
+  //\r
+  Buffer[sizeof (SMBIOS_TABLE_TYPE3) - sizeof (CONTAINED_ELEMENT)] = 5;\r
 \r
   OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
-  UnicodeStrToAsciiStr(Manufacturer, OptionalStrStart);\r
-  UnicodeStrToAsciiStr(Version, OptionalStrStart + ManuStrLen + 1);\r
-  UnicodeStrToAsciiStr(SerialNumber, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1);\r
-  UnicodeStrToAsciiStr(AssertTag, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1);\r
+  //\r
+  // Since we set ContainedElementCount = 0 and ContainedElementRecordLength = 0,\r
+  // remove sizeof (CONTAINED_ELEMENT) for ContainedElements[1].\r
+  //\r
+  OptionalStrStart -= sizeof (CONTAINED_ELEMENT);\r
+  //\r
+  // Add sizeof (SMBIOS_TABLE_STRING) for SKU Number, since not contained in SMBIOS_TABLE_TYPE3.\r
+  //\r
+  OptionalStrStart += sizeof (SMBIOS_TABLE_STRING);\r
+  UnicodeStrToAsciiStr (Manufacturer, OptionalStrStart);\r
+  UnicodeStrToAsciiStr (Version, OptionalStrStart + ManuStrLen + 1);\r
+  UnicodeStrToAsciiStr (SerialNumber, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1);\r
+  UnicodeStrToAsciiStr (AssetTag, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1);\r
+  UnicodeStrToAsciiStr (SkuNumber, OptionalStrStart + ManuStrLen + 1 + VerStrLen + 1 + SerialNumStrLen + 1 + AssetTagStrLen + 1);\r
 \r
   //\r
   // Now we have got the full smbios record, call smbios protocol to add this record.\r
   //\r
-  SmbiosHandle = 0;\r
-  Status = Smbios-> Add(\r
-                      Smbios, \r
-                      NULL,\r
-                      &SmbiosHandle, \r
-                      (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord\r
-                      );\r
+  Status = AddSmbiosRecord (Smbios, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord);\r
 \r
   FreePool(SmbiosRecord);\r
   return Status;\r