Blob Blame History Raw
From af082f3499de265d123157d097b5c84981e0aa63 Mon Sep 17 00:00:00 2001
From: Jon Maloy <jmaloy@redhat.com>
Date: Wed, 30 Mar 2022 14:52:34 -0400
Subject: [PATCH 15/18] acpi: fix OEM ID/OEM Table ID padding

RH-Author: Jon Maloy <jmaloy@redhat.com>
RH-MergeRequest: 141: acpi: fix QEMU crash when started with SLIC table
RH-Commit: [7/10] 51ea859cbe12b5a902d529ab589d18757d98f71d (jmaloy/qemu-kvm)
RH-Bugzilla: 2062611
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2062611
Upstream: Merged

commit 748c030f360a940fe0c9382c8ca1649096c3a80d
Author: Igor Mammedov <imammedo@redhat.com>
Date:   Wed Jan 12 08:03:31 2022 -0500

    acpi: fix OEM ID/OEM Table ID padding

    Commit [2] broke original '\0' padding of OEM ID and OEM Table ID
    fields in headers of ACPI tables. While it doesn't have impact on
    default values since QEMU uses 6 and 8 characters long values
    respectively, it broke usecase where IDs are provided on QEMU CLI.
    It shouldn't affect guest (but may cause licensing verification
    issues in guest OS).
    One of the broken usecases is user supplied SLIC table with IDs
    shorter than max possible length, where [2] mangles IDs with extra
    spaces in RSDT and FADT tables whereas guest OS expects those to
    mirror the respective values of the used SLIC table.

    Fix it by replacing whitespace padding with '\0' padding in
    accordance with [1] and expectations of guest OS

    1) ACPI spec, v2.0b
           17.2 AML Grammar Definition
           ...
           //OEM ID of up to 6 characters. If the OEM ID is
           //shorter than 6 characters, it can be terminated
           //with a NULL character.

    2)
    Fixes: 602b458201 ("acpi: Permit OEM ID and OEM table ID fields to be changed")
    Resolves: https://gitlab.com/qemu-project/qemu/-/issues/707
    Reported-by: Dmitry V. Orekhov <dima.orekhov@gmail.com>
    Signed-off-by: Igor Mammedov <imammedo@redhat.com>
    Cc: qemu-stable@nongnu.org
    Message-Id: <20220112130332.1648664-4-imammedo@redhat.com>
    Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Reviewed-by: Ani Sinha <ani@anisinha.ca>
    Tested-by: Dmitry V. Orekhov dima.orekhov@gmail.com

(cherry picked from commit 748c030f360a940fe0c9382c8ca1649096c3a80d)
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
---
 hw/acpi/aml-build.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
index b3b3310df3..65148d5b9d 100644
--- a/hw/acpi/aml-build.c
+++ b/hw/acpi/aml-build.c
@@ -1724,9 +1724,9 @@ void acpi_table_begin(AcpiTable *desc, GArray *array)
     build_append_int_noprefix(array, 0, 4); /* Length */
     build_append_int_noprefix(array, desc->rev, 1); /* Revision */
     build_append_int_noprefix(array, 0, 1); /* Checksum */
-    build_append_padded_str(array, desc->oem_id, 6, ' '); /* OEMID */
+    build_append_padded_str(array, desc->oem_id, 6, '\0'); /* OEMID */
     /* OEM Table ID */
-    build_append_padded_str(array, desc->oem_table_id, 8, ' ');
+    build_append_padded_str(array, desc->oem_table_id, 8, '\0');
     build_append_int_noprefix(array, 1, 4); /* OEM Revision */
     g_array_append_vals(array, ACPI_BUILD_APPNAME8, 4); /* Creator ID */
     build_append_int_noprefix(array, 1, 4); /* Creator Revision */
-- 
2.27.0