[libunwind] r372407 - Unwind: prevent unw_get_proc_info from returning stale data
Saleem Abdulrasool via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 20 08:53:43 PDT 2019
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();
}
More information about the cfe-commits
mailing list