]> git.proxmox.com Git - mirror_edk2.git/commitdiff
PcAtChipsetPkg/PcRtc: Fix a NULL pointer deference issue
authorRuiyu Ni <ruiyu.ni@intel.com>
Tue, 26 Jul 2016 13:07:19 +0000 (21:07 +0800)
committerRuiyu Ni <ruiyu.ni@intel.com>
Wed, 27 Jul 2016 02:27:16 +0000 (10:27 +0800)
When a platform which doesn't support ACPI 1.0 (no XSDT) and FADT
is not produced at the first time when ACPI table is published,
GetCenturyRtcAddress() unconditionally deference Rsdp->RsdtAddress
but Rsdp->RsdtAddress is 0 in this case.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcRtc.c

index 40d2e49173c095c36ec7f59b48bfe52bfcc3d517..2bb41e7e81a45d1e64ae9124068ca51778a8d093 100644 (file)
@@ -1250,8 +1250,6 @@ GetCenturyRtcAddress (
 {\r
   EFI_STATUS                                    Status;\r
   EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;\r
-  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;\r
-  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;\r
   EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt;\r
 \r
   Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **) &Rsdp);\r
@@ -1259,27 +1257,32 @@ GetCenturyRtcAddress (
     Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **) &Rsdp);\r
   }\r
 \r
-  if (EFI_ERROR (Status)) {\r
+  if (EFI_ERROR (Status) || (Rsdp == NULL)) {\r
     return 0;\r
   }\r
 \r
-  ASSERT (Rsdp != NULL);\r
+  Fadt = NULL;\r
 \r
   //\r
   // Find FADT in XSDT\r
   //\r
-  Fadt = NULL;\r
-  if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) {\r
-    Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress;\r
-    Fadt = ScanTableInSDT (Xsdt, EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, sizeof (UINTN));\r
+  if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp->XsdtAddress != 0) {\r
+    Fadt = ScanTableInSDT (\r
+             (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress,\r
+             EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,\r
+             sizeof (UINTN)\r
+             );\r
   }\r
 \r
-  if (Fadt == NULL) {\r
-    //\r
-    // Find FADT in RSDT\r
-    //\r
-    Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress;\r
-    Fadt = ScanTableInSDT (Rsdt, EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, sizeof (UINT32));\r
+  //\r
+  // Find FADT in RSDT\r
+  //\r
+  if (Fadt == NULL && Rsdp->RsdtAddress != 0) {\r
+    Fadt = ScanTableInSDT (\r
+             (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress,\r
+             EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,\r
+             sizeof (UINT32)\r
+             );\r
   }\r
 \r
   if ((Fadt != NULL) &&\r