Re: Bug#909242: Xvfb: segfaults on mips during gtk+3.0 build-time tests

Julien Cristau <[email protected]>
Newsgroups gmane.linux.debian.ports.mips
Message-ID <[email protected]>
Keeping cc to debian-mips, adding libunwind maintainer.

On 09/20/2018 10:23 AM, Simon McVittie wrote:
> Package: xvfb
> Version: 2:1.20.1-2
> Severity: important
> X-Debbugs-Cc: [email protected]
> User: [email protected]
> Usertags: mips
> 
> My recent gtk+3.0 upload to experimental failed many of its build-time
> tests on mips. The tests could not connect to the Xvfb server run by the
> upstream build system, which later crashed with a segmentation fault.
> 
> https://buildd.debian.org/status/fetch.php?pkg=gtk%2B3.0&arch=mips&ver=3.24.1-1&stamp=1537406479&file=log
> 
> I can reproduce this reliably on the mips porterbox, minkus, by running
> Xvfb in a schroot with the options shown below.
> 
Looking at this with libunwind8-dbgsym installed...

> Core was generated by `Xvfb -ac -noreset -screen 0 1024x768x16 :1 -nolisten tcp -auth /dev/null'.
> Program terminated with signal SIGSEGV, Segmentation fault.
> #0  0x77a7c3f8 in ?? () from /usr/lib/mips-linux-gnu/libunwind.so.8
> (gdb) bt
> #0  0x77a7c3f8 in ?? () from /usr/lib/mips-linux-gnu/libunwind.so.8
> #1  0x77a7c99c in _ULmips_is_signal_frame () from
/usr/lib/mips-linux-gnu/libunwind.so.8
> #2  0x77a7cbb0 in _ULmips_handle_signal_frame () from
/usr/lib/mips-linux-gnu/libunwind.so.8
> #3  0x77a7d01c in _ULmips_step () from
/usr/lib/mips-linux-gnu/libunwind.so.8
> #4  0x55eaaff0 in xorg_backtrace () at ../../../../os/backtrace.c:72
> #5  0x55eb0444 in OsSigHandler (signo=11, sip=0x7fd51fc8,
unused=<optimized out>) at ../../../../os/osinit.c:135
> #6  <signal handler called>

> #7  0x77a7c3f8 in ?? () from /usr/lib/mips-linux-gnu/libunwind.so.8

#0  access_mem (as=0x77e2e260 <local_addr_space>, addr=4,
val=0x7ffe4ff8, write=0, arg=0x7fff50d0) at mips/Ginit.c:104

    93  static int
    94  access_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t
*val, int write,
    95              void *arg)
    96  {
    97    if (write)
    98      {
    99        Debug (16, "mem[%llx] <- %llx\n", (long long) addr, (long
long) *val);
   100        *(unw_word_t *) (intptr_t) addr = *val;
   101      }
   102    else
   103      {
   104        *val = *(unw_word_t *) (intptr_t) addr;
   105        Debug (16, "mem[%llx] -> %llx\n", (long long) addr, (long
long) *val);
   106      }
   107    return 0;
   108  }

So at line 104 we're dereferencing addr, addr==4, boom.

> #8  0x77a7c99c in _ULmips_is_signal_frame () from
/usr/lib/mips-linux-gnu/libunwind.so.8

#1  0x77e1199c in _ULmips_is_signal_frame (cursor=0x7ffe50d0) at
mips/Gis_signal_frame.c:46

    29  PROTECTED int
    30  unw_is_signal_frame (unw_cursor_t *cursor)
    31  {
    32    struct cursor *c = (struct cursor *) cursor;
    33    unw_word_t w0, w1, ip;
    34    unw_addr_space_t as;
    35    unw_accessors_t *a;
    36    void *arg;
    37    int ret;
    38
    39    as = c->dwarf.as;
    40    a = unw_get_accessors (as);
    41    arg = c->dwarf.as_arg;
    42
    43    ip = c->dwarf.ip;
    44
    45    /* syscall */
    46    if ((ret = (*a->access_mem) (as, ip + 4, &w1, 0, arg)) < 0)
    47      return 0;
    48    if ((w1 & 0xffffffff) != 0x0c)
    49      return 0;
    50

(gdb) p c->dwarf
$5 = {as_arg = 0x7fff50d0, as = 0x77e2e260 <local_addr_space>, cfa =
2147373240, ip = 0, args_size = 0, ret_addr_column = 0, eh_args = {0,
0}, eh_valid_mask = 0, loc = {{val = 2147438844}, {val = 2147438852}, {
      val = 2147438860}, {val = 2147438868}, {val = 2147438876}, {val =
2147438884}, {val = 2147438892}, {val = 2147438900}, {val = 2147438908},
{val = 2147438916}, {val = 2147438924}, {val = 2147438932}, {
      val = 2147438940}, {val = 2147438948}, {val = 2147438956}, {val =
2147438964}, {val = 2147438972}, {val = 2147438980}, {val = 2147438988},
{val = 2147438996}, {val = 2147439004}, {val = 2147439012}, {
      val = 2147439020}, {val = 2147439028}, {val = 2147439036}, {val =
2147439044}, {val = 2147439052}, {val = 2147439060}, {val = 2147439068},
{val = 2147439076}, {val = 2147439084}, {val = 2147439092}, {
      val = 0}, {val = 0}, {val = 2147438832}, {val = 0} <repeats 153
times>}, stash_frames = 0, use_prev_instr = 1, pi_valid = 0,
pi_is_dynamic = 0, pi = {start_ip = 0, end_ip = 0, lsda = 0, handler = 0,
    gp = 0, flags = 0, format = 0, unwind_info_size = 0, unwind_info =
0x0, extra = {<No data fields>}}, hint = 0, prev_rs = 0}

At line 46 we call access_mem with addr == c->dwarf.ip + 4, and
c->dwarf.ip is 0.

I'll stop there for now.

Cheers,
Julien

> #9  0x77a7cbb0 in _ULmips_handle_signal_frame () from
/usr/lib/mips-linux-gnu/libunwind.so.8

#2  0x77e11bb0 in _ULmips_handle_signal_frame (cursor=0x7ffe50d0) at
mips/Gstep.c:37

> #10 0x77a7d01c in _ULmips_step () from
/usr/lib/mips-linux-gnu/libunwind.so.8

#3  0x77e1201c in _ULmips_step (cursor=0x7ffe50d0) at mips/Gstep.c:119


> #11 0x77a7a8f8 in unw_backtrace () from /usr/lib/mips-linux-gnu/libunwind.so.8
> #12 0x55eb06b0 in OsInit () at ../../../../os/osinit.c:217
> #13 0x55e4d708 in dix_main (argc=11, argv=0x7fd639e4, envp=<optimized out>) at ../../../../dix/main.c:154
> #14 0x7759ccf8 in __libc_start_main () from /lib/mips-linux-gnu/libc.so.6
> #15 0x55d28e34 in __start ()
> Backtrace stopped: frame did not save the PC
> 
> Line 217 is this backtrace() call:
> 
> #ifdef HAVE_BACKTRACE
>         /*
>          * initialize the backtracer, since the ctor calls dlopen(), which
>          * calls malloc(), which isn't signal-safe.
>          */
>         do {
>             void *array;
> 
>             backtrace(&array, 1);                         <--- here
>         } while (0);
> #endif
> 
> so this might really be a libunwind bug (please reassign if you think so).
> libunwind8:mips 1.2.1-8 was installed.
> 
> I thought this might be hardware-specific, but according to machines.cgi,
> mips-sil-01 (where gtk+3.0 failed) and mips-manda-01 (where a libepoxy
> build with the same xvfb and libunwind8 versions, also using Xvfb for
> tests, succeeded) are matching hardware, a Rhino Labs UTM8.  minkus,
> the porterbox where I reproduced this, is apparently an EdgeRouter Pro.
> 
> Xvfb is used in many packages' build-time tests, which for most
> maintainers are the only evidence we have that our packages are at all
> functional on mips, so it might be a good idea to work around this in
> Xvfb by disabling backtrace support and/or libunwind on mips.
> 
>     smcv
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.