Hello there, This is the compiler-rt patch I'd like to cherry-pick so that the hwasan tests pass.
It is in LLVM as commit 83ac18205ec69a00ac2be3b603bc3a61293fbe89. Ok for trunk? Also is the libhwasan library merge from the below email OK for trunk? https://gcc.gnu.org/pipermail/gcc-patches/2020-November/558999.html (Note I would also add a line to README.gcc mentioning compiler-rt/lib/hwasan on top of the changes in that patch). I would guess so, but wasn't certain the OK had ever been said anywhere. Regards, Matthew ------------------------- In `GetGlobalSizeFromDescriptor` we use `dladdr` to get info on the the current address. `dladdr` returns 0 if it failed. During testing on Linux this returned 0 to indicate failure, and populated the `info` structure with a NULL pointer which was dereferenced later. This patch checks for `dladdr` returning 0, and in that case returns 0 from `GetGlobalSizeFromDescriptor` to indicate failure of identifying the address. This occurs when `GetModuleNameAndOffsetForPC` succeeds for some address not in a dynamically loaded library. One example is when the found "module" is '[stack]' having come from parsing /proc/self/maps. Cherry-pick from 83ac18205ec69a00ac2be3b603bc3a61293fbe89. Differential Revision: https://reviews.llvm.org/D91344 ############### Attachment also inlined for ease of reply ############### diff --git a/libsanitizer/hwasan/hwasan_report.cpp b/libsanitizer/hwasan/hwasan_report.cpp index 0be7deeaee1a0bd523d9e0fe1dc3b1311b3920e2..894a149775f291bae9cad833b1ac54914212f405 100644 --- a/libsanitizer/hwasan/hwasan_report.cpp +++ b/libsanitizer/hwasan/hwasan_report.cpp @@ -254,7 +254,8 @@ static bool TagsEqual(tag_t tag, tag_t *tag_ptr) { static uptr GetGlobalSizeFromDescriptor(uptr ptr) { // Find the ELF object that this global resides in. Dl_info info; - dladdr(reinterpret_cast<void *>(ptr), &info); + if (dladdr(reinterpret_cast<void *>(ptr), &info) == 0) + return 0; auto *ehdr = reinterpret_cast<const ElfW(Ehdr) *>(info.dli_fbase); auto *phdr_begin = reinterpret_cast<const ElfW(Phdr) *>( reinterpret_cast<const u8 *>(ehdr) + ehdr->e_phoff);
diff --git a/libsanitizer/hwasan/hwasan_report.cpp b/libsanitizer/hwasan/hwasan_report.cpp index 0be7deeaee1a0bd523d9e0fe1dc3b1311b3920e2..894a149775f291bae9cad833b1ac54914212f405 100644 --- a/libsanitizer/hwasan/hwasan_report.cpp +++ b/libsanitizer/hwasan/hwasan_report.cpp @@ -254,7 +254,8 @@ static bool TagsEqual(tag_t tag, tag_t *tag_ptr) { static uptr GetGlobalSizeFromDescriptor(uptr ptr) { // Find the ELF object that this global resides in. Dl_info info; - dladdr(reinterpret_cast<void *>(ptr), &info); + if (dladdr(reinterpret_cast<void *>(ptr), &info) == 0) + return 0; auto *ehdr = reinterpret_cast<const ElfW(Ehdr) *>(info.dli_fbase); auto *phdr_begin = reinterpret_cast<const ElfW(Phdr) *>( reinterpret_cast<const u8 *>(ehdr) + ehdr->e_phoff);