Author: compnerd Date: Fri Sep 20 08:53:42 2019 New Revision: 372407 URL: http://llvm.org/viewvc/llvm-project?rev=372407&view=rev Log: Unwind: prevent unw_get_proc_info from returning stale data
If unwind info is not available at the current IP, unw_get_proc_info should return a zero-filled structure rather than the info of the previous IP. This change also makes unw_get_proc_info return UNW_ENOINFO instead of UNW_ESUCCESS. Patch by Amanieu d'Antras! Modified: libunwind/trunk/src/UnwindCursor.hpp libunwind/trunk/test/libunwind_01.pass.cpp Modified: libunwind/trunk/src/UnwindCursor.hpp URL: http://llvm.org/viewvc/llvm-project/libunwind/trunk/src/UnwindCursor.hpp?rev=372407&r1=372406&r2=372407&view=diff ============================================================================== --- libunwind/trunk/src/UnwindCursor.hpp (original) +++ libunwind/trunk/src/UnwindCursor.hpp Fri Sep 20 08:53:42 2019 @@ -1991,7 +1991,10 @@ int UnwindCursor<A, R>::step() { template <typename A, typename R> void UnwindCursor<A, R>::getInfo(unw_proc_info_t *info) { - *info = _info; + if (_unwindInfoMissing) + memset(info, 0, sizeof(*info)); + else + *info = _info; } template <typename A, typename R> Modified: libunwind/trunk/test/libunwind_01.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libunwind/trunk/test/libunwind_01.pass.cpp?rev=372407&r1=372406&r2=372407&view=diff ============================================================================== --- libunwind/trunk/test/libunwind_01.pass.cpp (original) +++ libunwind/trunk/test/libunwind_01.pass.cpp Fri Sep 20 08:53:42 2019 @@ -35,8 +35,29 @@ void test3(int i, int j, int k) { test2(j, k); } +void test_no_info() { + unw_context_t context; + unw_getcontext(&context); + + unw_cursor_t cursor; + unw_init_local(&cursor, &context); + + unw_proc_info_t info; + int ret = unw_get_proc_info(&cursor, &info); + if (ret != UNW_ESUCCESS) + abort(); + + // Set the IP to an address clearly outside any function. + unw_set_reg(&cursor, UNW_REG_IP, (unw_word_t)&context); + + ret = unw_get_proc_info(&cursor, &info); + if (ret != UNW_ENOINFO) + abort(); +} + int main() { test1(1); test2(1, 2); test3(1, 2, 3); + test_no_info(); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits