Go to file
Uli Schlachter c7f8b28d8d Fix use-after-free in x11 backend during shutdown
The xcb_connection_t instance that is used here comes from
XGetXCBConnection(), is created by XOpenDisplay(), and is owned by the
returned Display*. Calling xcb_disconnect() directly on it leads to
various use-after-frees during shutdown, as reported by valgrind. The
first one of the about 30 errors is:

    Invalid read of size 4
       at 0x71F2051: xcb_take_socket (in /usr/lib64/libxcb.so.1.1.0)
       by 0x78551DD: ??? (in /usr/lib64/libX11.so.6.3.0)
       by 0x7855A14: _XFlush (in /usr/lib64/libX11.so.6.3.0)
       by 0x7858504: _XGetRequest (in /usr/lib64/libX11.so.6.3.0)
       by 0x7838966: XFreeGC (in /usr/lib64/libX11.so.6.3.0)
       by 0x783238B: XCloseDisplay (in /usr/lib64/libX11.so.6.3.0)
       by 0x4E680C2: wlr_x11_backend_destroy (backend.c:333)
       by 0x4E57E94: wlr_backend_destroy (backend.c:39)
       by 0x4E629FB: multi_backend_destroy (backend.c:47)
       by 0x4E62B5A: handle_display_destroy (backend.c:90)
       by 0x50B7E9F: ??? (in /usr/lib64/libwayland-server.so.0.1.0)
       by 0x50B8476: wl_display_destroy (in /usr/lib64/libwayland-server.so.0.1.0)
     Address 0xc14dda0 is 0 bytes inside a block of size 21,152 free'd
       at 0x4C2DD18: free (vg_replace_malloc.c:530)
       by 0x4E680A5: wlr_x11_backend_destroy (backend.c:330)
       by 0x4E57E94: wlr_backend_destroy (backend.c:39)
       by 0x4E629FB: multi_backend_destroy (backend.c:47)
       by 0x4E62B5A: handle_display_destroy (backend.c:90)
       by 0x50B7E9F: ??? (in /usr/lib64/libwayland-server.so.0.1.0)
       by 0x50B8476: wl_display_destroy (in /usr/lib64/libwayland-server.so.0.1.0)
       by 0x40C54E: main (main.c:84)
     Block was alloc'd at
       at 0x4C2EA1E: calloc (vg_replace_malloc.c:711)
       by 0x71F0C60: xcb_connect_to_fd (in /usr/lib64/libxcb.so.1.1.0)
       by 0x71F4BD4: xcb_connect_to_display_with_auth_info (in /usr/lib64/libxcb.so.1.1.0)
       by 0x7854AA1: _XConnectXCB (in /usr/lib64/libX11.so.6.3.0)
       by 0x7845481: XOpenDisplay (in /usr/lib64/libX11.so.6.3.0)
       by 0x4E681B6: wlr_x11_backend_create (backend.c:376)
       by 0x4E580EE: wlr_backend_autocreate (backend.c:99)
       by 0x40C27D: main (main.c:35)

Normally, one would expect this to crash during XCloseDisplay() when
xcb_disconnect() is called again and frees the same data again (glibc would
detect a double free). However, XCloseDisplay() tries to clean up some internal
caches first for which it has to send requests to the X11 server (e.g. the
XFreeGC() above). This fails since the file descriptor was already closed,
which causes an IO error. Xlib's _XDefaultIOError() handles this by printing an
error message and calling exit(1).

Thus, the only symptom of this problem was compositors exiting
mid-shutdown and printing an error message:

    XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
          after 6 requests (6 known processed) with 0 events remaining.

Fixes: https://github.com/swaywm/wlroots/issues/745
Signed-off-by: Uli Schlachter <psychon@znc.in>
2018-03-26 10:48:30 +02:00
backend Fix use-after-free in x11 backend during shutdown 2018-03-26 10:48:30 +02:00
examples render/gles2: make wlr_renderer_begin take viewport size 2018-03-21 07:37:09 +01:00
include unified xdg-surface close 2018-03-24 15:11:26 -04:00
protocol Add initial linux_dmabuf protocol support 2018-03-15 12:40:18 +01:00
render linux-dmabuf: Support multi plane formats like NV12 2018-03-23 09:03:31 +01:00
rootston unified xdg-surface close 2018-03-24 15:11:26 -04:00
types Merge pull request #741 from emersion/unmapped-surface-destroy 2018-03-25 11:04:37 -04:00
util Rename _strip_path to wlr_strip_path 2018-02-21 10:25:52 +01:00
xcursor Revert "ELF Visibility" 2018-02-19 18:01:27 -05:00
xwayland xwm.h: fix guard ifdef and remove wlr_ prefix from xwm_atoms_contains 2018-03-04 11:16:18 +01:00
.build.yml Change .build.yml upstream to GitHub 2018-03-03 23:11:06 -05:00
.editorconfig Add wlr_primary_selection_device_manager and wlr_primary_selection_source 2017-12-22 19:20:12 +01:00
.gitignore update .gitignore 2018-03-03 15:23:26 +01:00
CONTRIBUTING.md Update CONTRIBUTING.md 2017-12-27 10:39:53 -05:00
LICENSE Initial commit 2017-04-25 11:32:52 -04:00
README.md Remove Travis in favor of builds.sr.ht 2018-03-04 16:33:45 -05:00
glgen.sh Change glapi.sh to generate both files 2017-11-22 14:04:29 +13:00
meson.build meson: use current_source_dir instead of source_root 2018-03-12 12:15:26 +01:00
meson_options.txt xcb errors: optional dependency with improved messages 2018-03-03 11:46:04 +01:00
wlroots.syms render/gles2: make wlr_renderer_begin take viewport size 2018-03-21 07:37:09 +01:00

README.md

wlroots

Pluggable, composable modules for building a Wayland compositor.

This is a WIP: status

Contributing

See CONTRIBUTING.md

Building

Install dependencies:

  • wayland
  • wayland-protocols
  • EGL
  • GLESv2
  • DRM
  • GBM
  • libinput
  • udev
  • pixman
  • systemd (optional, for logind support)
  • elogind (optional, for logind support on systems without systemd)
  • libcap (optional, for capability support)
  • asciidoc (optional, for man pages)

Run these commands:

meson build
ninja -C build

(On FreeBSD, you need to pass an extra flag to prevent a linking error: meson build -D b_lundef=false)

Running the Reference Compositor

wlroots comes with a reference compositor called rootston that demonstrates the features of the library.

After building, run rootston from a terminal or VT with:

./build/rootston/rootston

Now you can run windows in the compositor from the command line or by configuring bindings in your rootston.ini file.