diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2019-09-20 15:53:42 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2019-09-20 15:53:42 +0000 |
commit | ae685e7aab7f278cf197b8b1b1ccf76a6e884682 (patch) | |
tree | 7c1a02632c4b2a57145e484dfddcb55eba4823aa /libunwind/test | |
parent | af77ca7e6e738b7963a622e4c35807ecc52f854b (diff) | |
download | bcm5719-llvm-ae685e7aab7f278cf197b8b1b1ccf76a6e884682.tar.gz bcm5719-llvm-ae685e7aab7f278cf197b8b1b1ccf76a6e884682.zip |
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!
llvm-svn: 372407
Diffstat (limited to 'libunwind/test')
-rw-r--r-- | libunwind/test/libunwind_01.pass.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/libunwind/test/libunwind_01.pass.cpp b/libunwind/test/libunwind_01.pass.cpp index 6957d98f956..830dcdd44f2 100644 --- a/libunwind/test/libunwind_01.pass.cpp +++ b/libunwind/test/libunwind_01.pass.cpp @@ -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(); } |