At shutdown, the Xserver will free all its resources which includes the RRCrtc and RROutput created. Xwayland would do the same in its xwl_output_destroy() called from xwl_close_screen(), leading to a double free of existing RRCrtc RROutput: Invalid read of size 4 at 0x4CDA10: RRCrtcDestroy (rrcrtc.c:689) by 0x426E75: xwl_output_destroy (xwayland-output.c:301) by 0x424144: xwl_close_screen (xwayland.c:117) by 0x460E17: CursorCloseScreen (cursor.c:187) by 0x4EB5A3: AnimCurCloseScreen (animcur.c:106) by 0x4EF431: present_close_screen (present_screen.c:64) by 0x556D40: dix_main (main.c:354) by 0x6F0D290: (below main) (in /usr/lib/libc-2.24.so) Address 0xbb1fc30 is 0 bytes inside a block of size 728 free'd at 0x4C2BDB0: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4CCE5F: RRCrtcDestroyResource (rrcrtc.c:719) by 0x577541: doFreeResource (resource.c:895) by 0x5787B5: FreeClientResources (resource.c:1161) by 0x578862: FreeAllResources (resource.c:1176) by 0x556C54: dix_main (main.c:323) by 0x6F0D290: (below main) (in /usr/lib/libc-2.24.so) Block was alloc'd at at 0x4C2CA6A: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4CC6DB: RRCrtcCreate (rrcrtc.c:76) by 0x426D1C: xwl_output_create (xwayland-output.c:264) by 0x4232EC: registry_global (xwayland.c:431) by 0x76CB1C7: ffi_call_unix64 (in /usr/lib/libffi.so.6.0.4) by 0x76CAC29: ffi_call (in /usr/lib/libffi.so.6.0.4) by 0x556CEFD: wl_closure_invoke (connection.c:935) by 0x5569CBF: dispatch_event.isra.4 (wayland-client.c:1310) by 0x556AF13: dispatch_queue (wayland-client.c:1456) by 0x556AF13: wl_display_dispatch_queue_pending (wayland-client.c:1698) by 0x556B33A: wl_display_roundtrip_queue (wayland-client.c:1121) by 0x42371C: xwl_screen_init (xwayland.c:631) by 0x552F60: AddScreen (dispatch.c:3864) And: Invalid read of size 4 at 0x522890: RROutputDestroy (rroutput.c:348) by 0x42684E: xwl_output_destroy (xwayland-output.c:302) by 0x423CF4: xwl_close_screen (xwayland.c:118) by 0x4B6377: CursorCloseScreen (cursor.c:187) by 0x539503: AnimCurCloseScreen (animcur.c:106) by 0x53D081: present_close_screen (present_screen.c:64) by 0x43DBF0: dix_main (main.c:354) by 0x7068730: (below main) (libc-start.c:289) Address 0xc403190 is 0 bytes inside a block of size 154 free'd at 0x4C2CD5A: free (vg_replace_malloc.c:530) by 0x521DF3: RROutputDestroyResource (rroutput.c:389) by 0x45DA61: doFreeResource (resource.c:895) by 0x45ECFD: FreeClientResources (resource.c:1161) by 0x45EDC2: FreeAllResources (resource.c:1176) by 0x43DB04: dix_main (main.c:323) by 0x7068730: (below main) (libc-start.c:289) Block was alloc'd at at 0x4C2BBAD: malloc (vg_replace_malloc.c:299) by 0x52206B: RROutputCreate (rroutput.c:84) by 0x426763: xwl_output_create (xwayland-output.c:270) by 0x422EDC: registry_global (xwayland.c:432) by 0x740FC57: ffi_call_unix64 (unix64.S:76) by 0x740F6B9: ffi_call (ffi64.c:525) by 0x5495A9D: wl_closure_invoke (connection.c:949) by 0x549283F: dispatch_event.isra.4 (wayland-client.c:1274) by 0x5493A13: dispatch_queue (wayland-client.c:1420) by 0x5493A13: wl_display_dispatch_queue_pending (wayland-client.c:1662) by 0x5493D2E: wl_display_roundtrip_queue (wayland-client.c:1085) by 0x4232EC: xwl_screen_init (xwayland.c:632) by 0x439F50: AddScreen (dispatch.c:3864) Split xwl_output_destroy() into xwl_output_destroy() which frees the wl_output and the xwl_output structure, and xwl_output_remove() which does the RRCrtcDestroy() and RROutputDestroy() and call the latter only when an output is effectively removed. An additional benefit, on top of avoiding a double free, is to avoid updating the screen size at shutdown. Signed-off-by: Olivier Fourdan <ofourdan@redhat.com> Reviewed-by: Hans de Goede <hdegoede@redhat.com>
209 lines
5.6 KiB
C
209 lines
5.6 KiB
C
/*
|
|
* Copyright © 2014 Intel Corporation
|
|
*
|
|
* Permission to use, copy, modify, distribute, and sell this software
|
|
* and its documentation for any purpose is hereby granted without
|
|
* fee, provided that the above copyright notice appear in all copies
|
|
* and that both that copyright notice and this permission notice
|
|
* appear in supporting documentation, and that the name of the
|
|
* copyright holders not be used in advertising or publicity
|
|
* pertaining to distribution of the software without specific,
|
|
* written prior permission. The copyright holders make no
|
|
* representations about the suitability of this software for any
|
|
* purpose. It is provided "as is" without express or implied
|
|
* warranty.
|
|
*
|
|
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
|
|
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
* FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
* SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
|
* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
|
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
* SOFTWARE.
|
|
*/
|
|
|
|
#ifndef XWAYLAND_H
|
|
#define XWAYLAND_H
|
|
|
|
#include <dix-config.h>
|
|
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
|
|
#include <wayland-client.h>
|
|
|
|
#include <X11/X.h>
|
|
|
|
#include <fb.h>
|
|
#include <input.h>
|
|
#include <dix.h>
|
|
#include <randrstr.h>
|
|
#include <exevents.h>
|
|
|
|
struct xwl_screen {
|
|
int width;
|
|
int height;
|
|
int depth;
|
|
ScreenPtr screen;
|
|
int expecting_event;
|
|
enum RootClipMode root_clip_mode;
|
|
|
|
int wm_fd;
|
|
int listen_fds[5];
|
|
int listen_fd_count;
|
|
int rootless;
|
|
int glamor;
|
|
|
|
CreateScreenResourcesProcPtr CreateScreenResources;
|
|
CloseScreenProcPtr CloseScreen;
|
|
CreateWindowProcPtr CreateWindow;
|
|
DestroyWindowProcPtr DestroyWindow;
|
|
RealizeWindowProcPtr RealizeWindow;
|
|
UnrealizeWindowProcPtr UnrealizeWindow;
|
|
XYToWindowProcPtr XYToWindow;
|
|
|
|
struct xorg_list output_list;
|
|
struct xorg_list seat_list;
|
|
struct xorg_list damage_window_list;
|
|
|
|
int wayland_fd;
|
|
struct wl_display *display;
|
|
struct wl_registry *registry;
|
|
struct wl_registry *input_registry;
|
|
struct wl_compositor *compositor;
|
|
struct wl_shm *shm;
|
|
struct wl_shell *shell;
|
|
|
|
uint32_t serial;
|
|
|
|
#define XWL_FORMAT_ARGB8888 (1 << 0)
|
|
#define XWL_FORMAT_XRGB8888 (1 << 1)
|
|
#define XWL_FORMAT_RGB565 (1 << 2)
|
|
|
|
int prepare_read;
|
|
|
|
char *device_name;
|
|
int drm_fd;
|
|
int fd_render_node;
|
|
struct wl_drm *drm;
|
|
uint32_t formats;
|
|
uint32_t capabilities;
|
|
void *egl_display, *egl_context;
|
|
struct gbm_device *gbm;
|
|
struct glamor_context *glamor_ctx;
|
|
};
|
|
|
|
struct xwl_window {
|
|
struct xwl_screen *xwl_screen;
|
|
struct wl_surface *surface;
|
|
struct wl_shell_surface *shell_surface;
|
|
WindowPtr window;
|
|
DamagePtr damage;
|
|
struct xorg_list link_damage;
|
|
struct wl_callback *frame_callback;
|
|
};
|
|
|
|
#define MODIFIER_META 0x01
|
|
|
|
struct xwl_touch {
|
|
struct xwl_window *window;
|
|
int32_t id;
|
|
int x, y;
|
|
struct xorg_list link_touch;
|
|
};
|
|
|
|
struct xwl_seat {
|
|
DeviceIntPtr pointer;
|
|
DeviceIntPtr keyboard;
|
|
DeviceIntPtr touch;
|
|
struct xwl_screen *xwl_screen;
|
|
struct wl_seat *seat;
|
|
struct wl_pointer *wl_pointer;
|
|
struct wl_keyboard *wl_keyboard;
|
|
struct wl_touch *wl_touch;
|
|
struct wl_array keys;
|
|
struct xwl_window *focus_window;
|
|
uint32_t id;
|
|
uint32_t pointer_enter_serial;
|
|
struct xorg_list link;
|
|
CursorPtr x_cursor;
|
|
struct wl_surface *cursor;
|
|
struct wl_callback *cursor_frame_cb;
|
|
Bool cursor_needs_update;
|
|
|
|
struct xorg_list touches;
|
|
|
|
size_t keymap_size;
|
|
char *keymap;
|
|
struct wl_surface *keyboard_focus;
|
|
|
|
struct xorg_list sync_pending;
|
|
};
|
|
|
|
struct xwl_output {
|
|
struct xorg_list link;
|
|
struct wl_output *output;
|
|
uint32_t server_output_id;
|
|
struct xwl_screen *xwl_screen;
|
|
RROutputPtr randr_output;
|
|
RRCrtcPtr randr_crtc;
|
|
int32_t x, y, width, height, refresh;
|
|
Rotation rotation;
|
|
};
|
|
|
|
struct xwl_pixmap;
|
|
|
|
void xwl_sync_events (struct xwl_screen *xwl_screen);
|
|
|
|
Bool xwl_screen_init_cursor(struct xwl_screen *xwl_screen);
|
|
|
|
struct xwl_screen *xwl_screen_get(ScreenPtr screen);
|
|
|
|
void xwl_seat_set_cursor(struct xwl_seat *xwl_seat);
|
|
|
|
void xwl_seat_destroy(struct xwl_seat *xwl_seat);
|
|
|
|
void xwl_seat_clear_touch(struct xwl_seat *xwl_seat, WindowPtr window);
|
|
|
|
Bool xwl_screen_init_output(struct xwl_screen *xwl_screen);
|
|
|
|
struct xwl_output *xwl_output_create(struct xwl_screen *xwl_screen,
|
|
uint32_t id);
|
|
|
|
void xwl_output_destroy(struct xwl_output *xwl_output);
|
|
|
|
void xwl_output_remove(struct xwl_output *xwl_output);
|
|
|
|
RRModePtr xwayland_cvt(int HDisplay, int VDisplay,
|
|
float VRefresh, Bool Reduced, Bool Interlaced);
|
|
|
|
void xwl_pixmap_set_private(PixmapPtr pixmap, struct xwl_pixmap *xwl_pixmap);
|
|
struct xwl_pixmap *xwl_pixmap_get(PixmapPtr pixmap);
|
|
|
|
|
|
Bool xwl_shm_create_screen_resources(ScreenPtr screen);
|
|
PixmapPtr xwl_shm_create_pixmap(ScreenPtr screen, int width, int height,
|
|
int depth, unsigned int hint);
|
|
Bool xwl_shm_destroy_pixmap(PixmapPtr pixmap);
|
|
struct wl_buffer *xwl_shm_pixmap_get_wl_buffer(PixmapPtr pixmap);
|
|
|
|
|
|
Bool xwl_glamor_init(struct xwl_screen *xwl_screen);
|
|
|
|
Bool xwl_screen_init_glamor(struct xwl_screen *xwl_screen,
|
|
uint32_t id, uint32_t version);
|
|
struct wl_buffer *xwl_glamor_pixmap_get_wl_buffer(PixmapPtr pixmap);
|
|
|
|
#ifdef XV
|
|
/* glamor Xv Adaptor */
|
|
Bool xwl_glamor_xv_init(ScreenPtr pScreen);
|
|
#endif
|
|
|
|
#ifdef XF86VIDMODE
|
|
void xwlVidModeExtensionInit(void);
|
|
#endif
|
|
|
|
#endif
|