From 07fe71f59b13bbc336ece3ec9ef94dd95c9e0511 Mon Sep 17 00:00:00 2001 From: Palmer Dabbelt Date: Thu, 23 Jun 2022 14:49:32 -0700 Subject: [PATCH] arm: Avoid UB in elf_machine_rel() This recently came up during a cleanup to remove misaligned accesses from the RISC-V port. Link: https://sourceware.org/pipermail/libc-alpha/2022-June/139961.html Suggested-by: Adhemerval Zanella Signed-off-by: Palmer Dabbelt Reviewed-by: Fangrui Song --- sysdeps/arm/dl-machine.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h index dd1a0f6b6e..9186831be3 100644 --- a/sysdeps/arm/dl-machine.h +++ b/sysdeps/arm/dl-machine.h @@ -349,10 +349,7 @@ elf_machine_rel (struct link_map *map, struct r_scope_elem *scope[], break; case R_ARM_ABS32: { - struct unaligned - { - Elf32_Addr x; - } __attribute__ ((packed, may_alias)); + ElfW(Addr) tmp; # ifndef RTLD_BOOTSTRAP /* This is defined in rtld.c, but nowhere in the static libc.a; make the reference weak so static programs can @@ -372,7 +369,9 @@ elf_machine_rel (struct link_map *map, struct r_scope_elem *scope[], value -= SYMBOL_ADDRESS (map, refsym, true); # endif /* Support relocations on mis-aligned offsets. */ - ((struct unaligned *) reloc_addr)->x += value; + memcpy (&tmp, reloc_addr, sizeof tmp); + tmp += value; + memcpy (reloc_addr, &tmp, sizeof tmp); break; } case R_ARM_TLS_DESC: