Xpra: Ticket #2328: ubuntu 16.04 python3 shadow server segfault on exit

Discovered whilst testing for #2296.

Only seems to affect Ubuntu 16.04: also tested on Fedora and Ubuntu 18.04.

The server segfault can be triggered from both xpra stop and the exit-with-client switch.



Thu, 13 Jun 2019 12:21:14 GMT - Antoine Martin: status changed

One does not need to ever have connected a client to trigger the segfault, which should rule out x11 shared memory race conditions during cleanup.

Still occurs when running with minimal features enabled:

--no-clipboard --no-windows --no-speaker --no-microphone \
--video-encoders=none --encodings=rgb \
--xsettings=no --no-system-tray --no-notifications --no-mdns

(though I did find a bug along the way: r22927)

Backtrace from gdb:

#0  0x00007ffff0b82134 in gdk_error_trap_push ()
    at /build/gtk+3.0-2Ut_nl/gtk+3.0-3.18.9/./gdk/gdkdisplay.c:2185
#1  0x00007fffec53de40 in ffi_call_unix64 () from /usr/lib/x86_64-linux-gnu/libffi.so.6
#2  0x00007fffec53d8ab in ffi_call () from /usr/lib/x86_64-linux-gnu/libffi.so.6
#3  0x00007fffe9b2d8fc in ?? () from /usr/lib/python3/dist-packages/gi/_gi.cpython-35m-x86_64-linux-gnu.so
#4  0x00007fffe9b2f3e8 in ?? () from /usr/lib/python3/dist-packages/gi/_gi.cpython-35m-x86_64-linux-gnu.so
#5  0x00000000005c20e7 in PyObject_Call () at ../Objects/abstract.c:2165
#6  0x000000000053b656 in do_call (nk=<optimized out>, na=<optimized out>, pp_stack=0x7fffffffb550,
    func=<optimized out>) at ../Python/ceval.c:4936
#7  call_function (oparg=<optimized out>, pp_stack=0x7fffffffb550) at ../Python/ceval.c:4732
#8  PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#9  0x000000000053b294 in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffb680, func=<optimized out>) at ../Python/ceval.c:4803
#10 call_function (oparg=<optimized out>, pp_stack=0x7fffffffb680) at ../Python/ceval.c:4730
#11 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#12 0x0000000000540b0b in _PyEval_EvalCodeWithName (qualname=0x0, name=0x0, closure=0x0, kwdefs=0x0,
    defcount=0, defs=0x0, kwcount=0, kws=<optimized out>, argcount=<optimized out>, args=<optimized out>,
    locals=<optimized out>, globals=<optimized out>, _co=<code at remote 0x7fffe978a1e0>)
    at ../Python/ceval.c:4018
#13 PyEval_EvalCodeEx () at ../Python/ceval.c:4039
#14 0x00000000004ec2e3 in function_call.lto_priv () at ../Objects/funcobject.c:627
#15 0x00000000005c20e7 in PyObject_Call () at ../Objects/abstract.c:2165
#16 0x00000000004fbfce in method_call.lto_priv () at ../Objects/classobject.c:330
#17 0x00000000005c20e7 in PyObject_Call () at ../Objects/abstract.c:2165
#18 0x00000000005c22d8 in PyObject_CallFunctionObjArgs () at ../Objects/abstract.c:2445
---Type <return> to continue, or q <return> to quit---
#19 0x00000000005387c5 in PyEval_EvalFrameEx () at ../Python/ceval.c:3107
#20 0x000000000053b294 in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffbbe0, func=<optimized out>) at ../Python/ceval.c:4803
#21 call_function (oparg=<optimized out>, pp_stack=0x7fffffffbbe0) at ../Python/ceval.c:4730
#22 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#23 0x000000000053b294 in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffbd10, func=<optimized out>) at ../Python/ceval.c:4803
#24 call_function (oparg=<optimized out>, pp_stack=0x7fffffffbd10) at ../Python/ceval.c:4730
#25 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#26 0x000000000053b294 in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffbe40, func=<optimized out>) at ../Python/ceval.c:4803
#27 call_function (oparg=<optimized out>, pp_stack=0x7fffffffbe40) at ../Python/ceval.c:4730
#28 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#29 0x000000000053b294 in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffbf70, func=<optimized out>) at ../Python/ceval.c:4803
#30 call_function (oparg=<optimized out>, pp_stack=0x7fffffffbf70) at ../Python/ceval.c:4730
#31 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#32 0x00000000005401ef in _PyEval_EvalCodeWithName () at ../Python/ceval.c:4018
#33 0x000000000053b83f in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffc180, func=<optimized out>) at ../Python/ceval.c:4813
#34 call_function (oparg=<optimized out>, pp_stack=0x7fffffffc180) at ../Python/ceval.c:4730
#35 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#36 0x000000000053b294 in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffc2b0, func=<optimized out>) at ../Python/ceval.c:4803
#37 call_function (oparg=<optimized out>, pp_stack=0x7fffffffc2b0) at ../Python/ceval.c:4730
---Type <return> to continue, or q <return> to quit---
#38 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#39 0x000000000053b294 in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffc3e0, func=<optimized out>) at ../Python/ceval.c:4803
#40 call_function (oparg=<optimized out>, pp_stack=0x7fffffffc3e0) at ../Python/ceval.c:4730
#41 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#42 0x0000000000540b0b in _PyEval_EvalCodeWithName (qualname=0x0, name=0x0, closure=0x0, kwdefs=0x0,
    defcount=0, defs=0x0, kwcount=0, kws=<optimized out>, argcount=<optimized out>, args=<optimized out>,
    locals=<optimized out>, globals=<optimized out>, _co=<code at remote 0x7fffe967cd20>)
    at ../Python/ceval.c:4018
#43 PyEval_EvalCodeEx () at ../Python/ceval.c:4039
#44 0x00000000004ec2e3 in function_call.lto_priv () at ../Objects/funcobject.c:627
#45 0x00000000005c20e7 in PyObject_Call () at ../Objects/abstract.c:2165
#46 0x00000000004fbfce in method_call.lto_priv () at ../Objects/classobject.c:330
#47 0x00000000005c20e7 in PyObject_Call () at ../Objects/abstract.c:2165
#48 0x0000000000534870 in PyEval_CallObjectWithKeywords () at ../Python/ceval.c:4580
#49 0x00007fffe9b2b4cc in ?? () from /usr/lib/python3/dist-packages/gi/_gi.cpython-35m-x86_64-linux-gnu.so
#50 0x00007fffec53dc2f in ffi_closure_unix64_inner () from /usr/lib/x86_64-linux-gnu/libffi.so.6
#51 0x00007fffec53dfa8 in ffi_closure_unix64 () from /usr/lib/x86_64-linux-gnu/libffi.so.6
#52 0x00007fffefa2d04a in g_main_context_dispatch () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#53 0x00007fffefa2d3f0 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#54 0x00007fffefa2d712 in g_main_loop_run () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#55 0x00007fffe8f5b395 in gtk_main () at /build/gtk+3.0-2Ut_nl/gtk+3.0-3.18.9/./gtk/gtkmain.c:1241
#56 0x00007fffec53de40 in ffi_call_unix64 () from /usr/lib/x86_64-linux-gnu/libffi.so.6
#57 0x00007fffec53d8ab in ffi_call () from /usr/lib/x86_64-linux-gnu/libffi.so.6
#58 0x00007fffe9b2d8fc in ?? () from /usr/lib/python3/dist-packages/gi/_gi.cpython-35m-x86_64-linux-gnu.so
---Type <return> to continue, or q <return> to quit---
#59 0x00007fffe9b2f3e8 in ?? () from /usr/lib/python3/dist-packages/gi/_gi.cpython-35m-x86_64-linux-gnu.so
#60 0x00000000005c20e7 in PyObject_Call () at ../Objects/abstract.c:2165
#61 0x000000000053b656 in do_call (nk=<optimized out>, na=<optimized out>, pp_stack=0x7fffffffcd60,
    func=<optimized out>) at ../Python/ceval.c:4936
#62 call_function (oparg=<optimized out>, pp_stack=0x7fffffffcd60) at ../Python/ceval.c:4732
#63 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#64 0x000000000053b294 in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffce90, func=<optimized out>) at ../Python/ceval.c:4803
#65 call_function (oparg=<optimized out>, pp_stack=0x7fffffffce90) at ../Python/ceval.c:4730
#66 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#67 0x00000000005401ef in _PyEval_EvalCodeWithName () at ../Python/ceval.c:4018
#68 0x000000000053bc93 in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffd0a0, func=<optimized out>) at ../Python/ceval.c:4813
#69 call_function (oparg=<optimized out>, pp_stack=0x7fffffffd0a0) at ../Python/ceval.c:4730
#70 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#71 0x00000000005401ef in _PyEval_EvalCodeWithName () at ../Python/ceval.c:4018
#72 0x000000000053b83f in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffd2b0, func=<optimized out>) at ../Python/ceval.c:4813
#73 call_function (oparg=<optimized out>, pp_stack=0x7fffffffd2b0) at ../Python/ceval.c:4730
#74 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#75 0x000000000053fc97 in _PyEval_EvalCodeWithName () at ../Python/ceval.c:4018
#76 0x000000000053b83f in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffd4c0, func=<optimized out>) at ../Python/ceval.c:4813
#77 call_function (oparg=<optimized out>, pp_stack=0x7fffffffd4c0) at ../Python/ceval.c:4730
#78 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
---Type <return> to continue, or q <return> to quit---
#79 0x00000000005401ef in _PyEval_EvalCodeWithName () at ../Python/ceval.c:4018
#80 0x000000000053bc93 in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffd6d0, func=<optimized out>) at ../Python/ceval.c:4813
#81 call_function (oparg=<optimized out>, pp_stack=0x7fffffffd6d0) at ../Python/ceval.c:4730
#82 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#83 0x000000000053b294 in fast_function (nk=<optimized out>, na=<optimized out>, n=<optimized out>,
    pp_stack=0x7fffffffd800, func=<optimized out>) at ../Python/ceval.c:4803
#84 call_function (oparg=<optimized out>, pp_stack=0x7fffffffd800) at ../Python/ceval.c:4730
#85 PyEval_EvalFrameEx () at ../Python/ceval.c:3236
#86 0x000000000053fc97 in _PyEval_EvalCodeWithName () at ../Python/ceval.c:4018
#87 0x00000000005409bf in PyEval_EvalCodeEx () at ../Python/ceval.c:4039
#88 PyEval_EvalCode (co=<optimized out>, globals=<optimized out>, locals=<optimized out>)
    at ../Python/ceval.c:777
#89 0x000000000060cb42 in run_mod () at ../Python/pythonrun.c:976
#90 0x000000000060efea in PyRun_FileExFlags () at ../Python/pythonrun.c:929
#91 0x000000000060f7dc in PyRun_SimpleFileExFlags () at ../Python/pythonrun.c:396
#92 0x0000000000640256 in run_file (p_cf=0x7fffffffda70, filename=0xa752e0 L"/usr/bin/xpra", fp=0xad5e80)
    at ../Modules/main.c:318
#93 Py_Main () at ../Modules/main.c:768
#94 0x00000000004d0001 in main () at ../Programs/python.c:65
#95 0x00007ffff7810830 in __libc_start_main (main=0x4cff20 <main>, argc=19, argv=0x7fffffffdc88,
    init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffdc78)
    at ../csu/libc-start.c:291
#96 0x00000000005d6999 in _start ()
(gdb) py-bt
Traceback (most recent call first):
  File "/usr/lib/python3/dist-packages/xpra/gtk_common/error.py", line 109, in Xenter
    gdk.error_trap_push()
  File "/usr/lib/python3/dist-packages/xpra/gtk_common/error.py", line 207, in __enter__
    trap.Xenter()
  File "/usr/lib/python3/dist-packages/xpra/x11/x11_server_core.py", line 310, in do_cleanup
    with xswallow:
  File "/usr/lib/python3/dist-packages/xpra/server/server_core.py", line 433, in cleanup
    self.do_cleanup()
  File "/usr/lib/python3/dist-packages/xpra/server/shadow/gtk_shadow_server_base.py", line 54, in cleanup
    GTKServerBase.cleanup(self)     #@UndefinedVariable
  File "/usr/lib/python3/dist-packages/xpra/x11/shadow_x11_server.py", line 143, in cleanup
    GTKShadowServerBase.cleanup(self)
  File "/usr/lib/python3/dist-packages/xpra/server/server_core.py", line 354, in clean_quit
    self.cleanup()
  File "/usr/lib/python3/dist-packages/xpra/server/server_base.py", line 842, in last_client_exited
    self.clean_quit(False)
  File "/usr/lib/python3/dist-packages/xpra/server/shadow/gtk_shadow_server_base.py", line 69, in last_client_exited
    GTKServerBase.last_client_exited(self)
  File "/usr/lib/python3/dist-packages/xpra/x11/shadow_x11_server.py", line 152, in last_client_exited
    GTKShadowServerBase.last_client_exited(self)
  File "/usr/lib/python3/dist-packages/xpra/server/gtk_server_base.py", line 94, in do_run
    gtk_main()
  File "/usr/lib/python3/dist-packages/xpra/server/server_core.py", line 409, in run
---Type <return> to continue, or q <return> to quit---
    self.do_run()
  File "/usr/lib/python3/dist-packages/xpra/scripts/server.py", line 958, in do_run_server
    r = app.run()
  File "/usr/lib/python3/dist-packages/xpra/scripts/server.py", line 444, in run_server
    return do_run_server(error_cb, opts, mode, xpra_file, extra_args, desktop_display)
  File "/usr/lib/python3/dist-packages/xpra/scripts/main.py", line 432, in run_mode
    return run_server(error_cb, options, mode, script_file, args, current_display)
  File "/usr/lib/python3/dist-packages/xpra/scripts/main.py", line 97, in main
    return run_mode(script_file, err, options, args, mode, defaults)
  File "/usr/bin/xpra", line 26, in <module>
    sys.exit(main(sys.argv[0], sys.argv))

Thu, 13 Jun 2019 12:57:53 GMT - Antoine Martin: status changed; resolution set

The crash is triggered by close_gtk_display. Skipping this cleanup step with XPRA_CLOSE_GTK_DISPLAY=0 fixes the problem.

r22928 re-orders the cleanup code (related, but not a fix for this crash).

r22929 + r22930 just skips closing the display for python3 shadow servers on Ubuntu 16.04 only! (note: this cleanup code runs more than once, but that's not the cause of the crash)


Thu, 20 Jun 2019 05:20:23 GMT - Antoine Martin:

close_gtk_display had been moved in r22678 for #1123.


Wed, 13 May 2020 06:22:43 GMT - Antoine Martin:

The default has been changed due to more crashes in Ubuntu 20.04: ticket:2761#comment:3.


Sat, 23 Jan 2021 05:48:22 GMT - migration script:

this ticket has been moved to: https://github.com/Xpra-org/xpra/issues/2328