<div dir="ltr"><div><div><div><div><div><div><div><div><div><div>Hi all,<br><br></div>This is a quick heads up, I was experiencing random crashes in Xwayland (very annoying in gnome-shell and it takes gnome-shell and the entire session with it). while running skype with current Xwayladn from 1.20 rc4.<br><br></div>Running Xwayland in valgrind yields a lot of memory corruption when unrealizing windows:<br><br> Invalid read of size 8<br>    at 0x42C802: xwl_present_cleanup (xwayland-present.c:84)<br>    by 0x42BA67: xwl_unrealize_window (xwayland.c:601)<br>    by 0x541EE9: compUnrealizeWindow (compwindow.c:285)<br>    by 0x57E1FA: UnrealizeTree (window.c:2816)<br>    by 0x581189: UnmapWindow (window.c:2874)<br>    by 0x54EB26: ProcUnmapWindow (dispatch.c:879)<br>    by 0x554B7D: Dispatch (dispatch.c:479)<br>    by 0x558BE5: dix_main (main.c:276)<br>    by 0x7C4B1BA: (below main) (libc-start.c:308)<br>  Address 0xf520f60 is 96 bytes inside a block of size 184 free'd<br>    at 0x4C2EDAC: free (vg_replace_malloc.c:530)<br>    by 0x42B9FB: xwl_unrealize_window (xwayland.c:624)<br>    by 0x541EE9: compUnrealizeWindow (compwindow.c:285)<br>    by 0x57E1FA: UnrealizeTree (window.c:2816)<br>    by 0x581189: UnmapWindow (window.c:2874)<br>    by 0x54EB26: ProcUnmapWindow (dispatch.c:879)<br>    by 0x554B7D: Dispatch (dispatch.c:479)<br>    by 0x558BE5: dix_main (main.c:276)<br>    by 0x7C4B1BA: (below main) (libc-start.c:308)<br>  Block was alloc'd at<br>    at 0x4C2FB06: calloc (vg_replace_malloc.c:711)<br>    by 0x42B307: xwl_realize_window (xwayland.c:488)<br>    by 0x541E59: compRealizeWindow (compwindow.c:268)<br>    by 0x57DA40: RealizeTree (window.c:2617)<br>    by 0x580B28: MapWindow (window.c:2694)<br>    by 0x54EA2A: ProcMapWindow (dispatch.c:845)<br>    by 0x554B7D: Dispatch (dispatch.c:479)<br>    by 0x558BE5: dix_main (main.c:276)<br>    by 0x7C4B1BA: (below main) (libc-start.c:308)<br> <br></div>So when unrealizing the entire tree, the xwl_window returned by xwl_window_of_top() is invalid as already freed.<br><br></div>Removing that call to xwl_present_cleanup() shows that xwl_window_of_self() also returns an invalid freed xwl_window the same way (not surprising).<br><br></div>This is due to commit 82df2ce3:<br><br>Author: Roman Gilg <<a href="mailto:subdiff@gmail.com">subdiff@gmail.com</a>><br>Date:   Tue Aug 22 15:38:26 2017 +0200<br><br>    xwayland: Avoid repeatedly looping through window ancestor chain<br>    <br>    Calling xwl_window_from_window means looping through the window ancestor<br>    chain whenever it is called on a child window or on an automatically<br>    redirected window.<br>    <br>    Since these properties and the potential ancestor's xwl_window are constant<br>    between window realization and unrealization, we can omit the looping by<br>    always putting the respective xwl_window in the Window's private field on<br>    its realization. If the Window doesn't feature an xwl_window on its own,<br>    it's the xwl_window of its first ancestor with one.<br>    <br>    Signed-off-by: Roman Gilg <<a href="mailto:subdiff@gmail.com">subdiff@gmail.com</a>><br>    Reviewed-by: Pekka Paalanen <<a href="mailto:pekka.paalanen@collabora.co.uk">pekka.paalanen@collabora.co.uk</a>><br><br></div>I think the assumption there is invalid in the case of a UnrealizeTree().<br><br></div>Reverting that patch (and adjusting xwayland-present.c accordingly) solves the “invalid read” problem (as we don;t point to freed memoery anymore), but unfortunately that breaks xwayland-present logic that now leaves pending buffers and events after the unrealize()...<br><br> Invalid read of size 8<br>    at 0x42C7C3: xwl_present_buffer_release (xwayland-present.c:138)<br>    by 0x823203D: ffi_call_unix64 (unix64.S:76)<br>    by 0x82319FE: ffi_call (ffi64.c:525)<br>    by 0x56C32DC: wl_closure_invoke (connection.c:996)<br>    by 0x56BFA38: dispatch_event.isra.6 (wayland-client.c:1434)<br>    by 0x56C0F5B: dispatch_queue (wayland-client.c:1580)<br>    by 0x56C0F5B: wl_display_dispatch_queue_pending (wayland-client.c:1822)<br>    by 0x42A83A: xwl_read_events (xwayland.c:792)<br>    by 0x58B550: ospoll_wait (ospoll.c:651)<br>    by 0x584DEB: WaitForSomething (WaitFor.c:208)<br>    by 0x55492F: Dispatch (dispatch.c:421)<br>    by 0x558BE5: dix_main (main.c:276)<br>    by 0x79F81BA: (below main) (libc-start.c:308)<br>  Address 0x103ec328 is 104 bytes inside a block of size 184 free'd<br>    at 0x4C2EDAC: free (vg_replace_malloc.c:530)<br>    by 0x42BB24: xwl_unrealize_window (xwayland.c:620)<br>    by 0x541EE9: compUnrealizeWindow (compwindow.c:285)<br>    by 0x57E1FA: UnrealizeTree (window.c:2816)<br>    by 0x581189: UnmapWindow (window.c:2874)<br>    by 0x54EB26: ProcUnmapWindow (dispatch.c:879)<br>    by 0x554B7D: Dispatch (dispatch.c:479)<br>    by 0x558BE5: dix_main (main.c:276)<br>    by 0x79F81BA: (below main) (libc-start.c:308)<br>  Block was alloc'd at<br>    at 0x4C2FB06: calloc (vg_replace_malloc.c:711)<br>    by 0x42B389: xwl_realize_window (xwayland.c:486)<br>    by 0x541E59: compRealizeWindow (compwindow.c:268)<br>    by 0x57DA40: RealizeTree (window.c:2617)<br>    by 0x580B28: MapWindow (window.c:2694)<br>    by 0x54EA2A: ProcMapWindow (dispatch.c:845)<br>    by 0x554B7D: Dispatch (dispatch.c:479)<br>    by 0x558BE5: dix_main (main.c:276)<br>    by 0x79F81BA: (below main) (libc-start.c:308)<br> <br>and:<br><br>    at 0x42C7A2: __xorg_list_del (list.h:183)<br>    by 0x42C7A2: xorg_list_del (list.h:204)<br>    by 0x42C7A2: xwl_present_free_event (xwayland-present.c:116)<br>    by 0x42C7A2: xwl_present_buffer_release (xwayland-present.c:142)<br>    by 0x823203D: ffi_call_unix64 (unix64.S:76)<br>    by 0x82319FE: ffi_call (ffi64.c:525)<br>    by 0x56C32DC: wl_closure_invoke (connection.c:996)<br>    by 0x56BFA38: dispatch_event.isra.6 (wayland-client.c:1434)<br>    by 0x56C0F5B: dispatch_queue (wayland-client.c:1580)<br>    by 0x56C0F5B: wl_display_dispatch_queue_pending (wayland-client.c:1822)<br>    by 0x42A83A: xwl_read_events (xwayland.c:792)<br>    by 0x58B550: ospoll_wait (ospoll.c:651)<br>    by 0x584DEB: WaitForSomething (WaitFor.c:208)<br>    by 0x55492F: Dispatch (dispatch.c:421)<br>    by 0x558BE5: dix_main (main.c:276)<br>    by 0x79F81BA: (below main) (libc-start.c:308)<br>  Address 0x103ec370 is 176 bytes inside a block of size 184 free'd<br>    at 0x4C2EDAC: free (vg_replace_malloc.c:530)<br>    by 0x42BB24: xwl_unrealize_window (xwayland.c:620)<br>    by 0x541EE9: compUnrealizeWindow (compwindow.c:285)<br>    by 0x57E1FA: UnrealizeTree (window.c:2816)<br>    by 0x581189: UnmapWindow (window.c:2874)<br>    by 0x54EB26: ProcUnmapWindow (dispatch.c:879)<br>    by 0x554B7D: Dispatch (dispatch.c:479)<br>    by 0x558BE5: dix_main (main.c:276)<br>    by 0x79F81BA: (below main) (libc-start.c:308)<br>  Block was alloc'd at<br>    at 0x4C2FB06: calloc (vg_replace_malloc.c:711)<br>    by 0x42B389: xwl_realize_window (xwayland.c:486)<br>    by 0x541E59: compRealizeWindow (compwindow.c:268)<br>    by 0x57DA40: RealizeTree (window.c:2617)<br>    by 0x580B28: MapWindow (window.c:2694)<br>    by 0x54EA2A: ProcMapWindow (dispatch.c:845)<br>    by 0x554B7D: Dispatch (dispatch.c:479)<br>    by 0x558BE5: dix_main (main.c:276)<br>    by 0x79F81BA: (below main) (libc-start.c:308)<br><br></div>So this needs fixing somehow differently I think.<br><br></div>Cheers,<br></div>Olivier<br></div>