llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-libunwind Author: None (SihangZhu) <details> <summary>Changes</summary> Fix this issue [#<!-- -->76957](https://github.com/llvm/llvm-project/issues/76957) Libgcc provides __register_frame to register a dynamic .eh_frame section, while __unw_add_dynamic_eh_frame_section can be used to do the same in libunwind. However, the address after dynamic .eh_frame are padding with 0 value, it will be identified as legal CIE. And __unw_add_dynamic_eh_frame_section will continue to parse subsequent addresses until illegal memory or other sections are accessed. This patch adds length formal parameter for dynamic registration. --- Full diff: https://github.com/llvm/llvm-project/pull/77185.diff 2 Files Affected: - (modified) libunwind/src/libunwind.cpp (+3-2) - (modified) libunwind/src/libunwind_ext.h (+1-1) ``````````diff diff --git a/libunwind/src/libunwind.cpp b/libunwind/src/libunwind.cpp index cd610377b63de8..7d78d167b83434 100644 --- a/libunwind/src/libunwind.cpp +++ b/libunwind/src/libunwind.cpp @@ -318,13 +318,14 @@ void __unw_remove_dynamic_fde(unw_word_t fde) { DwarfFDECache<LocalAddressSpace>::removeAllIn((LocalAddressSpace::pint_t)fde); } -void __unw_add_dynamic_eh_frame_section(unw_word_t eh_frame_start) { +void __unw_add_dynamic_eh_frame_section(unw_word_t eh_frame_start, size_t length) { // The eh_frame section start serves as the mh_group unw_word_t mh_group = eh_frame_start; CFI_Parser<LocalAddressSpace>::CIE_Info cieInfo; CFI_Parser<LocalAddressSpace>::FDE_Info fdeInfo; auto p = (LocalAddressSpace::pint_t)eh_frame_start; - while (true) { + auto end = p + length; + while (p < end) { if (CFI_Parser<LocalAddressSpace>::decodeFDE( LocalAddressSpace::sThisAddressSpace, p, &fdeInfo, &cieInfo, true) == NULL) { diff --git a/libunwind/src/libunwind_ext.h b/libunwind/src/libunwind_ext.h index 28db43a4f6eef2..1bfb595c46130f 100644 --- a/libunwind/src/libunwind_ext.h +++ b/libunwind/src/libunwind_ext.h @@ -55,7 +55,7 @@ extern void __unw_iterate_dwarf_unwind_cache(void (*func)( extern void __unw_add_dynamic_fde(unw_word_t fde); extern void __unw_remove_dynamic_fde(unw_word_t fde); -extern void __unw_add_dynamic_eh_frame_section(unw_word_t eh_frame_start); +extern void __unw_add_dynamic_eh_frame_section(unw_word_t eh_frame_start, size_t length); extern void __unw_remove_dynamic_eh_frame_section(unw_word_t eh_frame_start); #ifdef __APPLE__ `````````` </details> https://github.com/llvm/llvm-project/pull/77185 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits