Mir clients (including Unity8 itself) crash in XGetXCBConnection() if multiple versions of mir-client-platform-mesa are installed.
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
Mir |
Fix Released
|
High
|
Daniel van Vugt | ||
mir (Ubuntu) |
Fix Released
|
High
|
Unassigned |
Bug Description
The mir egl platform fails to load under certain circumstances producing the following stack trace:
#0 0x00007ffff3a996e7 in XGetXCBConnection () from /usr/lib/
#1 0x00007ffff534dc74 in dri2_initialize
#2 dri2_initialize_x11 (drv=<optimized out>, disp=0x6d1b90) at ../../.
#3 0x00007ffff5347adf in _eglMatchAndIni
#4 0x00007ffff5347b99 in _eglMatchDriver (dpy=dpy@
#5 0x00007ffff5343b32 in eglInitialize (dpy=0x6d1b90, major=0x7ffffff
#6 0x00007ffff686cc1f in ?? () from /usr/lib/
#7 0x00007ffff686cd7b in ?? () from /usr/lib/
#8 0x00007ffff686d420 in ?? () from /usr/lib/
#9 0x00007ffff59dd82c in mir::graphics:
#10 0x00007ffff686de6b in ?? () from /usr/lib/
#11 0x00007ffff686e450 in ?? () from /usr/lib/
#12 0x00007ffff67fef3c in ?? () from /usr/lib/
#13 0x00007ffff67ff87d in ?? () from /usr/lib/
#14 0x00007ffff67fde31 in mir::DefaultSer
In the given case a 0.17.1 mirclient9 was combined with a 0.18 mirserver36. mirserver36 is compatible with mirclient9. The mirserver36 works with mirclient9. The significant difference lies in the client and server platforms. The native display used for egl initialization is created by the server. Mesa then uses a function from the client platform to validate the native display. For yet unknown reason the 0.17.1 libmirclient9 did select mesa.so.2 (from mir-client-
It did so probably because that version was a left over of the 0.14 release with a partially bumped ABI. So the remaining issue is that there is an ABI we have to care about between the native EGL Display given to mesa, and the client platform that validates it.
Related branches
- Chris Halse Rogers: Needs Fixing
- PS Jenkins bot (community): Needs Fixing (continuous-integration)
- Alan Griffiths: Abstain
- Mir CI Bot: Approve (continuous-integration)
-
Diff: 436 lines (+190/-42)6 files modifiedsrc/client/default_connection_configuration.cpp (+13/-21)
src/client/probing_client_platform_factory.cpp (+41/-4)
src/client/probing_client_platform_factory.h (+11/-2)
src/platforms/mesa/client/client_platform_factory.cpp (+9/-4)
tests/mir_test_framework/CMakeLists.txt (+1/-0)
tests/unit-tests/client/test_probing_client_platform_factory.cpp (+115/-11)
- PS Jenkins bot (community): Approve (continuous-integration)
- Mir CI Bot: Approve (continuous-integration)
- Kevin DuBois (community): Approve
-
Diff: 645 lines (+333/-43)13 files modifiedinclude/common/mir/plugin.h (+48/-0)
src/client/default_connection_configuration.cpp (+13/-21)
src/client/mir_connection.cpp (+1/-0)
src/client/mir_connection.h (+3/-0)
src/client/probing_client_platform_factory.cpp (+44/-5)
src/client/probing_client_platform_factory.h (+11/-2)
src/common/sharedlibrary/CMakeLists.txt (+1/-0)
src/common/sharedlibrary/plugin.cpp (+50/-0)
src/common/symbols.map (+6/-0)
src/include/client/mir/client_platform.h (+2/-1)
src/platforms/mesa/client/client_platform_factory.cpp (+7/-3)
tests/mir_test_framework/CMakeLists.txt (+1/-0)
tests/unit-tests/client/test_probing_client_platform_factory.cpp (+146/-11)
- Mir CI Bot: Approve (continuous-integration)
- Andreas Pokorny (community): Needs Fixing
- PS Jenkins bot (community): Needs Fixing (continuous-integration)
-
Diff: 2689 lines (+780/-1045)38 files modifiedexamples/server_example_adorning_compositor.cpp (+4/-19)
examples/server_example_adorning_compositor.h (+2/-9)
examples/server_example_custom_compositor.cpp (+5/-7)
include/server/mir/input/touch_visualizer.h (+0/-6)
include/server/mir/server.h (+2/-5)
include/test/mir/test/doubles/mock_input_device_observer.h (+0/-44)
src/client/buffer_stream.cpp (+0/-1)
src/client/buffer_vault.cpp (+1/-18)
src/client/buffer_vault.h (+0/-2)
src/client/default_connection_configuration.cpp (+13/-21)
src/client/mir_connection.cpp (+2/-4)
src/client/mir_connection.h (+1/-1)
src/client/probing_client_platform_factory.cpp (+41/-4)
src/client/probing_client_platform_factory.h (+11/-2)
src/client/rpc/mir_protobuf_rpc_channel.cpp (+14/-27)
src/client/rpc/mir_protobuf_rpc_channel.h (+1/-1)
src/include/client/mir/client_platform_factory.h (+3/-2)
src/platforms/android/client/client_platform_factory.cpp (+2/-2)
src/platforms/android/server/display.cpp (+0/-2)
src/platforms/mesa/client/client_platform_factory.cpp (+10/-5)
src/server/compositor/buffer_queue.cpp (+4/-24)
src/server/compositor/buffer_queue.h (+0/-1)
src/server/server.cpp (+0/-1)
tests/include/mir/test/doubles/mock_input_device.h (+0/-52)
tests/include/mir_test_framework/stub_client_platform_factory.h (+15/-0)
tests/integration-tests/input/CMakeLists.txt (+0/-1)
tests/integration-tests/input/test_single_seat_setup.cpp (+0/-452)
tests/mir_test_doubles/CMakeLists.txt (+0/-1)
tests/mir_test_doubles/mock_input_device.cpp (+0/-43)
tests/mir_test_framework/CMakeLists.txt (+1/-0)
tests/mir_test_framework/stub_client_platform_factory.cpp (+48/-56)
tests/mir_test_framework/stub_client_platform_module.cpp (+5/-2)
tests/unit-tests/client/test_buffer_vault.cpp (+1/-31)
tests/unit-tests/client/test_probing_client_platform_factory.cpp (+115/-11)
tests/unit-tests/client/test_protobuf_rpc_channel.cpp (+5/-5)
tests/unit-tests/compositor/test_buffer_queue.cpp (+5/-117)
tests/unit-tests/graphics/android/test_display.cpp (+0/-47)
tests/unit-tests/input/test_default_input_device_hub.cpp (+469/-19)
- Kevin DuBois (community): Approve
- Alan Griffiths: Approve
- Andreas Pokorny (community): Approve
- PS Jenkins bot (community): Approve (continuous-integration)
- Mir CI Bot: Approve (continuous-integration)
-
Diff: 652 lines (+255/-105)11 files modifiedsrc/client/default_connection_configuration.cpp (+13/-21)
src/client/probing_client_platform_factory.cpp (+41/-4)
src/client/probing_client_platform_factory.h (+11/-2)
src/include/client/mir/client_platform_factory.h (+3/-2)
src/platforms/android/client/client_platform_factory.cpp (+2/-2)
src/platforms/mesa/client/client_platform_factory.cpp (+10/-5)
tests/include/mir_test_framework/stub_client_platform_factory.h (+15/-0)
tests/mir_test_framework/CMakeLists.txt (+1/-0)
tests/mir_test_framework/stub_client_platform_factory.cpp (+48/-56)
tests/mir_test_framework/stub_client_platform_module.cpp (+5/-2)
tests/unit-tests/client/test_probing_client_platform_factory.cpp (+106/-11)
- PS Jenkins bot (community): Approve (continuous-integration)
- Daniel van Vugt: Approve
- Cemil Azizoglu (community): Approve
- Alexandros Frantzis (community): Approve
- Alberto Aguirre (community): Approve
- Mir CI Bot: Approve (continuous-integration)
-
Diff: 172 lines (+60/-29)5 files modifiedsrc/client/probing_client_platform_factory.cpp (+24/-23)
src/common/sharedlibrary/CMakeLists.txt (+1/-1)
src/common/sharedlibrary/shared_library_prober.cpp (+20/-5)
src/common/symbols.map (+7/-0)
src/include/common/mir/shared_library_prober.h (+8/-0)
- PS Jenkins bot (community): Needs Fixing (continuous-integration)
- Alan Griffiths: Disapprove
- Mir CI Bot: Needs Fixing (continuous-integration)
-
Diff: 18 lines (+8/-0)1 file modifieddebian/control (+8/-0)
description: | updated |
summary: |
- eglInitialize crashes on kvm qxl with mir + mir may use incompatible client platform to validate server display |
description: | updated |
summary: |
- mir may use incompatible client platform to validate server display + Mir may use incompatible client platform to validate server display and + crash in XGetXCBConnection() |
Changed in mir: | |
milestone: | 0.19.0 → 0.20.0 |
Changed in mir: | |
milestone: | 0.20.0 → 0.19.0 |
Changed in mir: | |
status: | Fix Committed → Fix Released |
What parameter is being passed to XGetXCBConnection() ?
It's not clear from the man page whether NULL is allowed (like XOpenDisplay), or what the error handling of XGetXCBConnection is meant to do in the absence of an X display.