summaryrefslogtreecommitdiffstats
path: root/libunwind/test
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2019-09-20 15:53:42 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2019-09-20 15:53:42 +0000
commitae685e7aab7f278cf197b8b1b1ccf76a6e884682 (patch)
tree7c1a02632c4b2a57145e484dfddcb55eba4823aa /libunwind/test
parentaf77ca7e6e738b7963a622e4c35807ecc52f854b (diff)
downloadbcm5719-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.cpp21
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();
}
OpenPOWER on IntegriCloud