From: Palmer Dabbelt Date: Thu, 23 Jun 2022 21:49:32 +0000 (-0700) Subject: arm: Avoid UB in elf_machine_rel() X-Git-Tag: glibc-2.40~66 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=07fe71f59b13bbc336ece3ec9ef94dd95c9e0511;p=thirdparty%2Fglibc.git 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 --- 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: