]> granicus.if.org Git - strace/commitdiff
Fix libunwind segfault when -p is passed before -k
authorSean Stangl <sstangl@mozilla.com>
Thu, 8 Dec 2016 19:54:24 +0000 (09:54 -1000)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 13 Dec 2016 20:21:22 +0000 (20:21 +0000)
* strace.c (init) [USE_LIBUNWIND]: Call unwind_tcb_init after
unwind_init for all allocated tcb structures if stack trace is enabled.
* unwind.c (unwind_tcb_init): Skip if tcb is already initialized.

Co-authored-by: Dmitry V. Levin <ldv@altlinux.org>
strace.c
unwind.c

index 1b8b5cca312d94a543900e7ee24c6ea373717a7f..56fdfdee29aae98b2ce69bebc7903692b7334408 100644 (file)
--- a/strace.c
+++ b/strace.c
@@ -1769,8 +1769,14 @@ init(int argc, char *argv[])
        }
 
 #ifdef USE_LIBUNWIND
-       if (stack_trace_enabled)
+       if (stack_trace_enabled) {
+               unsigned int tcbi;
+
                unwind_init();
+               for (tcbi = 0; tcbi < tcbtabsize; ++tcbi) {
+                       unwind_tcb_init(tcbtab[tcbi]);
+               }
+       }
 #endif
 
        /* See if they want to run as another user. */
index 238e215d0003c96138d3553ee41016818ee4bea7..326d184ee92b4df3324e61070032bd355ad83239 100644 (file)
--- a/unwind.c
+++ b/unwind.c
@@ -103,6 +103,9 @@ unwind_init(void)
 void
 unwind_tcb_init(struct tcb *tcp)
 {
+       if (tcp->libunwind_ui)
+               return;
+
        tcp->libunwind_ui = _UPT_create(tcp->pid);
        if (!tcp->libunwind_ui)
                die_out_of_memory();