From d6c389cb87b220f7005cebf483708267b5f4a1c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bernhard=20=C3=9Cbelacker?= Date: Sun, 27 Sep 2020 18:03:48 +0200 Subject: [PATCH] os: Fix instruction pointer written in xorg_backtrace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The address retrieved in "pip.start_ip" is not necessarily the same address as unw_get_proc_name finds as nearest symbol and returns in "off". Therefore using "pip.start_ip + off" is not reliable, at least visible in the binaries from the Debian repository. Bug-Debian: https://bugs.debian.org/971088 Signed-off-by: Bernhard Übelacker (cherry picked from commit c15dd0ba4893f79f7181e783cb1ba404edca917a) --- os/backtrace.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/os/backtrace.c b/os/backtrace.c index 619bf145e..2aad0e38a 100644 --- a/os/backtrace.c +++ b/os/backtrace.c @@ -45,6 +45,7 @@ xorg_backtrace(void) { unw_cursor_t cursor; unw_context_t context; + unw_word_t ip; unw_word_t off; unw_proc_info_t pip; int ret, i = 0; @@ -88,7 +89,9 @@ xorg_backtrace(void) procname[1] = 0; } - if (dladdr((void *)(uintptr_t)(pip.start_ip + off), &dlinfo) && dlinfo.dli_fname && + if (unw_get_reg (&cursor, UNW_REG_IP, &ip) < 0) + ip = pip.start_ip + off; + if (dladdr((void *)(uintptr_t)(ip), &dlinfo) && dlinfo.dli_fname && *dlinfo.dli_fname) filename = dlinfo.dli_fname; else @@ -96,7 +99,7 @@ xorg_backtrace(void) ErrorFSigSafe("%u: %s (%s%s+0x%x) [%p]\n", i++, filename, procname, ret == -UNW_ENOMEM ? "..." : "", (int)off, - (void *)(uintptr_t)(pip.start_ip + off)); + (void *)(uintptr_t)(ip)); ret = unw_step(&cursor); if (ret < 0) -- GitLab