From: Cwooper <cwooperm@gmail.com> wayland_configure_window() accesses data->rects.window after calling wayland_win_data_release(data). Save the window position into local variables before the release. --- dlls/winewayland.drv/window.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dlls/winewayland.drv/window.c b/dlls/winewayland.drv/window.c index 2c3d1f87408..fff3eed36f6 100644 --- a/dlls/winewayland.drv/window.c +++ b/dlls/winewayland.drv/window.c @@ -495,6 +495,7 @@ static void wayland_configure_window(HWND hwnd) BOOL needs_exit_size_move = FALSE; struct wayland_win_data *data; RECT rect; + LONG saved_window_left, saved_window_top; if (!(data = wayland_win_data_get(hwnd))) return; if (!(surface = data->wayland_surface)) @@ -575,6 +576,11 @@ static void wayland_configure_window(HWND hwnd) wayland_surface_coords_to_window(surface, width, height, &window_width, &window_height); + /* Save window position before releasing data, since data->rects may be + * modified by another thread after release. */ + saved_window_left = data->rects.window.left; + saved_window_top = data->rects.window.top; + wayland_win_data_release(data); TRACE("processing=%dx%d,%#x\n", width, height, state); @@ -601,7 +607,7 @@ static void wayland_configure_window(HWND hwnd) } SetRect(&rect, 0, 0, window_width, window_height); - OffsetRect(&rect, data->rects.window.left, data->rects.window.top); + OffsetRect(&rect, saved_window_left, saved_window_top); NtUserSetRawWindowPos(hwnd, rect, flags, FALSE); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10487