xserver: Branch 'master'

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Sep 28 17:15:56 UTC 2020


 os/backtrace.c |    7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

New commits:
commit c15dd0ba4893f79f7181e783cb1ba404edca917a
Author: Bernhard Übelacker <bernhardu at mailbox.org>
Date:   Sun Sep 27 18:03:48 2020 +0200

    os: Fix instruction pointer written in xorg_backtrace
    
    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 <bernhardu at mailbox.org>

diff --git a/os/backtrace.c b/os/backtrace.c
index 9f28b8809..fd3d6ab0d 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)


More information about the xorg-commit mailing list