diff --git a/valgrind-3.11.0-x86_unwind.patch b/valgrind-3.11.0-x86_unwind.patch index ca0063b..f6b62bb 100644 --- a/valgrind-3.11.0-x86_unwind.patch +++ b/valgrind-3.11.0-x86_unwind.patch @@ -107,3 +107,61 @@ index 8c1e9a4..137e780 100644 } goto unwind_done; } else { +commit 4520d562975820aced0fda6ed503379f337da66e +Author: philippe +Date: Wed Feb 17 22:41:14 2016 +0000 + + Fix incorrect (or infinite loop) unwind on RHEL7 amd64 64 bits. + + Same kind of problems as explained and fixed in revision 15720: + In some cases, unwinding always retrieves the same pc/sp/bp. + + Fix for 64 bits is similar: stop unwinding if the previous sp is >= new sp + + + + git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15794 a5019735-40e9-0310-863c-91ae7b9d1cf9 + +diff --git a/coregrind/m_stacktrace.c b/coregrind/m_stacktrace.c +index 137e780..ef4984c 100644 +--- a/coregrind/m_stacktrace.c ++++ b/coregrind/m_stacktrace.c +@@ -607,16 +607,25 @@ UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, + * next function which is completely wrong. + */ + while (True) { ++ Addr old_xsp; + + if (i >= max_n_ips) + break; + ++ old_xsp = uregs.xsp; ++ + /* Try to derive a new (ip,sp,fp) triple from the current set. */ + + /* First off, see if there is any CFI info to hand which can + be used. */ + if ( VG_(use_CF_info)( &uregs, fp_min, fp_max ) ) { + if (0 == uregs.xip || 1 == uregs.xip) break; ++ if (old_xsp >= uregs.xsp) { ++ if (debug) ++ VG_(printf) (" CF end of stack old_xsp %p >= xsp %p\n", ++ (void*)old_xsp, (void*)uregs.xsp); ++ break; ++ } + if (sps) sps[i] = uregs.xsp; + if (fps) fps[i] = uregs.xbp; + ips[i++] = uregs.xip - 1; /* -1: refer to calling insn, not the RA */ +@@ -646,6 +655,12 @@ UInt VG_(get_StackTrace_wrk) ( ThreadId tid_if_known, + if (0 == uregs.xip || 1 == uregs.xip) break; + uregs.xsp = uregs.xbp + sizeof(Addr) /*saved %rbp*/ + + sizeof(Addr) /*ra*/; ++ if (old_xsp >= uregs.xsp) { ++ if (debug) ++ VG_(printf) (" FF end of stack old_xsp %p >= xsp %p\n", ++ (void*)old_xsp, (void*)uregs.xsp); ++ break; ++ } + uregs.xbp = (((UWord*)uregs.xbp)[0]); + if (sps) sps[i] = uregs.xsp; + if (fps) fps[i] = uregs.xbp; diff --git a/valgrind.spec b/valgrind.spec index fb6c0eb..fa56aeb 100644 --- a/valgrind.spec +++ b/valgrind.spec @@ -3,7 +3,7 @@ Summary: Tool for finding memory management bugs in programs Name: %{?scl_prefix}valgrind Version: 3.11.0 -Release: 13%{?dist} +Release: 14%{?dist} Epoch: 1 License: GPLv2+ URL: http://www.valgrind.org/ @@ -96,6 +96,7 @@ Patch15: valgrind-3.11.0-socketcall-x86-linux.patch Patch16: valgrind-3.11.0-is_stmt.patch # Fix incorrect (or infinite loop) unwind on RHEL7 x86 32 bits. (svn r15729) +# Fix incorrect (or infinite loop) unwind on RHEL7 amd64 64 bits. (svn r15794) Patch17: valgrind-3.11.0-x86_unwind.patch # KDE#358478 drd/tests/std_thread.cpp doesn't build with GCC6 @@ -423,8 +424,9 @@ echo ===============END TESTING=============== %endif %changelog -* Thu Feb 18 2016 Mark Wielaard -- Update valgrind-3.11.0-futex.patch. +* Thu Feb 18 2016 Mark Wielaard - 3.11.0-14 +- Update valgrind-3.11.0-futex.patch (fix helgrind/drd regression). +- Update valgrind-3.11.0-x86_unwind.patch (include amd64 fix). * Wed Feb 17 2016 Mark Wielaard - 3.11.0-13 - Remove valgrind-3.11.0-no-stv.patch (gcc6 has been fixed).