LGTM! On Fri, Aug 18, 2017 at 8:16 AM, Dave Watson <davejwat...@fb.com> wrote:
> Repro for a multilib binary on host x86_64: > > CFLAGS="-m32" LDFLAGS="-m32" ./configure --enable-debug -- > host=i686-pc-linux-gnu --target=i686-pc-linux-gnu --libdur=/usr/lib32 > --prefix=/usr --disable-documentation > > make check > > Gtest-init function fails trying to step through libc_start_main. The CFA > function is: > > DW_CFA_def_cfa_offset: 112 > DW_CFA_advance_loc: 5 to ...643 > DW_CFA_restore state > > Where the return address is 643. > > Generally, it appears we apply all ip <= end_ip, which is incorrect in > some circumstances. > > libgcc only applies ip < end_ip + is_signal_frame, but that seems to break > async signal handling > tests in libunwind for unknown reasons. > > This is somewhat simlar to the fix in e9e8ed73e for GNU_args_size, > where the same ip check was added. > --- > src/dwarf/Gparser.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/src/dwarf/Gparser.c b/src/dwarf/Gparser.c > index e8eaeac8..9d405e76 100644 > --- a/src/dwarf/Gparser.c > +++ b/src/dwarf/Gparser.c > @@ -289,8 +289,10 @@ run_cfi_program (struct dwarf_cursor *c, > dwarf_state_record_t *sr, > ret = -UNW_EINVAL; > break; > } > - memcpy (&sr->rs_current, &(*rs_stack)->state, sizeof > (sr->rs_current)); > - pop_rstate_stack(rs_stack); > + if (*ip < end_ip) { > + memcpy (&sr->rs_current, &(*rs_stack)->state, sizeof > (sr->rs_current)); > + pop_rstate_stack(rs_stack); > + } > Debug (15, "CFA_restore_state\n"); > break; > > -- > 2.13.5 > > -- Saleem Abdulrasool compnerd (at) compnerd (dot) org
_______________________________________________ Libunwind-devel mailing list Libunwind-devel@nongnu.org https://lists.nongnu.org/mailman/listinfo/libunwind-devel