diff options
author | Ian Lance Taylor <iant@golang.org> | 2020-09-08 13:16:44 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2020-09-08 13:20:26 -0700 |
commit | 488e33339e6dea3262a11307592e9aad87a97c8d (patch) | |
tree | 03620cd607ca4ac7d94eeddcf3112d5740a67a87 /libbacktrace | |
parent | 651c61c3cef123d70ec3582d53b58526a8cadcf7 (diff) | |
download | gcc-488e33339e6dea3262a11307592e9aad87a97c8d.zip gcc-488e33339e6dea3262a11307592e9aad87a97c8d.tar.gz gcc-488e33339e6dea3262a11307592e9aad87a97c8d.tar.bz2 |
libbacktrace: correctly swap Mach-O 32-bit file offset
libbacktrace/ChangeLog:
PR libbacktrace/96973
* macho.c (macho_add_fat): Correctly swap 32-bit file offset.
Diffstat (limited to 'libbacktrace')
-rw-r--r-- | libbacktrace/macho.c | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/libbacktrace/macho.c b/libbacktrace/macho.c index bd73722..20dd326 100644 --- a/libbacktrace/macho.c +++ b/libbacktrace/macho.c @@ -793,13 +793,24 @@ macho_add_fat (struct backtrace_state *state, const char *filename, for (i = 0; i < nfat_arch; ++i) { - struct macho_fat_arch_64 fat_arch; uint32_t fcputype; + uint64_t foffset; if (is_64) - memcpy (&fat_arch, - (const char *) arch_view.data + i * arch_size, - arch_size); + { + struct macho_fat_arch_64 fat_arch_64; + + memcpy (&fat_arch_64, + (const char *) arch_view.data + i * arch_size, + arch_size); + fcputype = fat_arch_64.cputype; + foffset = fat_arch_64.offset; + if (swapped) + { + fcputype = __builtin_bswap32 (fcputype); + foffset = __builtin_bswap64 (foffset); + } + } else { struct macho_fat_arch fat_arch_32; @@ -807,26 +818,18 @@ macho_add_fat (struct backtrace_state *state, const char *filename, memcpy (&fat_arch_32, (const char *) arch_view.data + i * arch_size, arch_size); - fat_arch.cputype = fat_arch_32.cputype; - fat_arch.cpusubtype = fat_arch_32.cpusubtype; - fat_arch.offset = (uint64_t) fat_arch_32.offset; - fat_arch.size = (uint64_t) fat_arch_32.size; - fat_arch.align = fat_arch_32.align; - fat_arch.reserved = 0; + fcputype = fat_arch_32.cputype; + foffset = (uint64_t) fat_arch_32.offset; + if (swapped) + { + fcputype = __builtin_bswap32 (fcputype); + foffset = (uint64_t) __builtin_bswap32 ((uint32_t) foffset); + } } - fcputype = fat_arch.cputype; - if (swapped) - fcputype = __builtin_bswap32 (fcputype); - if (fcputype == cputype) { - uint64_t foffset; - /* FIXME: What about cpusubtype? */ - foffset = fat_arch.offset; - if (swapped) - foffset = __builtin_bswap64 (foffset); backtrace_release_view (state, &arch_view, error_callback, data); return macho_add (state, filename, descriptor, foffset, match_uuid, base_address, skip_symtab, error_callback, data, |