From: Mark Wielaard Date: Fri, 24 Dec 2021 01:01:32 +0000 (+0100) Subject: libdwfl: Calculate addr to read by hand in link_map.c read_addrs. X-Git-Tag: elfutils-0.187~43 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9f70a762ab88ceebb8a48a7c9c3ce39ff7f205af;p=thirdparty%2Felfutils.git libdwfl: Calculate addr to read by hand in link_map.c read_addrs. The gcc undefined sanitizer doesn't like the trick we use to calculate the (possibly) unaligned addresses to read. So calculate them by hand as unsigned char pointers. https://sourceware.org/bugzilla/show_bug.cgi?id=28720 Signed-off-by: Mark Wielaard --- diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index 73d8613cf..149383ad0 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,7 @@ +2021-12-23 Mark Wielaard + + * link_map.c (read_addrs): Calculate addr to read by hand. + 2021-12-23 Mark Wielaard * link_map.c (dwfl_link_map_report): Call memcpy and set in.d_buf to diff --git a/libdwfl/link_map.c b/libdwfl/link_map.c index f57c55854..cd9c50422 100644 --- a/libdwfl/link_map.c +++ b/libdwfl/link_map.c @@ -270,26 +270,25 @@ read_addrs (struct memory_closure *closure, return true; } - Elf32_Addr (*a32)[n] = vaddr - (*read_vaddr) + (*buffer); - Elf64_Addr (*a64)[n] = (void *) a32; + unsigned char *addr = vaddr - (*read_vaddr) + (*buffer); if (elfclass == ELFCLASS32) { if (elfdata == ELFDATA2MSB) for (size_t i = 0; i < n; ++i) - addrs[i] = BE32 (read_4ubyte_unaligned_noncvt (&(*a32)[i])); + addrs[i] = BE32 (read_4ubyte_unaligned_noncvt (addr + i * 4)); else for (size_t i = 0; i < n; ++i) - addrs[i] = LE32 (read_4ubyte_unaligned_noncvt (&(*a32)[i])); + addrs[i] = LE32 (read_4ubyte_unaligned_noncvt (addr + i * 4)); } else { if (elfdata == ELFDATA2MSB) for (size_t i = 0; i < n; ++i) - addrs[i] = BE64 (read_8ubyte_unaligned_noncvt (&(*a64)[i])); + addrs[i] = BE64 (read_8ubyte_unaligned_noncvt (addr + i * 8)); else for (size_t i = 0; i < n; ++i) - addrs[i] = LE64 (read_8ubyte_unaligned_noncvt (&(*a64)[i])); + addrs[i] = LE64 (read_8ubyte_unaligned_noncvt (addr + i * 8)); } return false;