|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 1/2] xen/ppc: Fix opal.c's misaligned DT reads to avoid tripping UBSAN
Fix two misaligned reads from the FDT in the opal setup code to avoid
tripping UBSAN failures. Without this change, UBSAN-enabled builds on
PPC will fail on boot before the serial console is even initialized.
Reported-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Signed-off-by: Shawn Anastasio <sanastasio@xxxxxxxxxxxxxxxxxxxxx>
---
xen/arch/ppc/opal.c | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/xen/arch/ppc/opal.c b/xen/arch/ppc/opal.c
index 1183b7d5ef..3d0e4daf27 100644
--- a/xen/arch/ppc/opal.c
+++ b/xen/arch/ppc/opal.c
@@ -34,8 +34,9 @@ static void opal_putchar(char c)
void __init boot_opal_init(const void *fdt)
{
int opal_node;
- const __be64 *opal_base;
- const __be64 *opal_entry;
+ const __be64 *opal_base_p;
+ const __be64 *opal_entry_p;
+ __be64 opal_base, opal_entry;
if ( fdt_check_header(fdt) < 0 )
{
@@ -54,17 +55,20 @@ void __init boot_opal_init(const void *fdt)
die();
}
- opal_base = fdt_getprop(fdt, opal_node, "opal-base-address", NULL);
- opal_entry = fdt_getprop(fdt, opal_node, "opal-entry-address", NULL);
- if ( !opal_base || !opal_entry )
+ opal_base_p = fdt_getprop(fdt, opal_node, "opal-base-address", NULL);
+ opal_entry_p = fdt_getprop(fdt, opal_node, "opal-entry-address", NULL);
+ if ( !opal_base_p || !opal_entry_p )
{
early_printk("Failed to get opal-base-address/opal-entry-address "
"property from DT!\n");
die();
}
- opal.base = be64_to_cpu(*opal_base);
- opal.entry = be64_to_cpu(*opal_entry);
+ memcpy(&opal_base, opal_base_p, sizeof(opal_base));
+ memcpy(&opal_entry, opal_entry_p, sizeof(opal_entry));
+
+ opal.base = be64_to_cpu(opal_base);
+ opal.entry = be64_to_cpu(opal_entry);
early_printk_init(opal_putchar);
--
2.30.2
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |