Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package wlroots for openSUSE:Factory checked in at 2025-10-28 14:47:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/wlroots (Old) and /work/SRC/openSUSE:Factory/.wlroots.new.1980 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "wlroots" Tue Oct 28 14:47:05 2025 rev:38 rq:1313916 version:0.19.2 Changes: -------- --- /work/SRC/openSUSE:Factory/wlroots/wlroots.changes 2025-10-13 15:36:55.325215679 +0200 +++ /work/SRC/openSUSE:Factory/.wlroots.new.1980/wlroots.changes 2025-10-28 14:47:52.498240784 +0100 @@ -1,0 +2,12 @@ +Fri Oct 24 15:18:31 UTC 2025 - zeus <[email protected]> + +- Update to 0.19.2 + * xwm: Fix double-close + * xwayland: fix assertion failure in wlr_xwayland_shell_v1 + * backend, output: send commit events after applying all in wlr_backend_commit() + * backend/session: fix crash on udev device remove event + * linux_drm_syncobj_v1: fix use-after-free in surface_commit_destroy() + * ci: fix VKMS lookup after faux bus migration + * util/box.c: use 1/256 instead of 1/65536 in wlr_box_closest_point() + +------------------------------------------------------------------- Old: ---- wlroots-0.19.1.tar.gz wlroots-0.19.1.tar.gz.sig New: ---- wlroots-0.19.2.tar.gz wlroots-0.19.2.tar.gz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ wlroots.spec ++++++ --- /var/tmp/diff_new_pack.fycKl6/_old 2025-10-28 14:47:53.202270393 +0100 +++ /var/tmp/diff_new_pack.fycKl6/_new 2025-10-28 14:47:53.202270393 +0100 @@ -18,7 +18,7 @@ %global ver_suffix 0.19 %global sover 0_19 -%global patch_ver 1 +%global patch_ver 2 %global libname libwlroots-%{sover} %bcond_without drm_backend %bcond_without libinput_backend ++++++ wlroots-0.19.1.tar.gz -> wlroots-0.19.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.19.1/.builds/archlinux.yml new/wlroots-0.19.2/.builds/archlinux.yml --- old/wlroots-0.19.1/.builds/archlinux.yml 2025-09-21 23:03:29.000000000 +0200 +++ new/wlroots-0.19.2/.builds/archlinux.yml 2025-10-22 00:21:53.000000000 +0200 @@ -41,9 +41,10 @@ cd wlroots/build-gcc/tinywl sudo modprobe vkms udevadm settle + card="/dev/dri/$(ls /sys/devices/faux/vkms/drm/ | grep ^card)" export WLR_BACKENDS=drm export WLR_RENDERER=pixman - export WLR_DRM_DEVICES=/dev/dri/by-path/platform-vkms-card + export WLR_DRM_DEVICES="$card" export UBSAN_OPTIONS=halt_on_error=1 - sudo chmod ugo+rw /dev/dri/by-path/platform-vkms-card + sudo chmod ugo+rw "$card" sudo -E seatd-launch -- ./tinywl -s 'kill $PPID' || [ $? = 143 ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.19.1/backend/backend.c new/wlroots-0.19.2/backend/backend.c --- old/wlroots-0.19.1/backend/backend.c 2025-09-21 23:03:29.000000000 +0200 +++ new/wlroots-0.19.2/backend/backend.c 2025-10-22 00:21:53.000000000 +0200 @@ -485,5 +485,10 @@ output_apply_commit(state->output, &state->base); } + for (size_t i = 0; i < states_len; i++) { + const struct wlr_backend_output_state *state = &states[i]; + output_send_commit_event(state->output, &state->base); + } + return true; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.19.1/backend/session/session.c new/wlroots-0.19.2/backend/session/session.c --- old/wlroots-0.19.1/backend/session/session.c 2025-09-21 23:03:29.000000000 +0200 +++ new/wlroots-0.19.2/backend/session/session.c 2025-10-22 00:21:53.000000000 +0200 @@ -367,7 +367,10 @@ } assert(wl_list_empty(&dev->events.change.listener_list)); - assert(wl_list_empty(&dev->events.remove.listener_list)); + // TODO: assert that the "remove" listener list is empty as well. Listeners + // will typically call wlr_session_close_file() in response, and + // wl_signal_emit_mutable() installs two phantom listeners, so we'd count + // these two. close(dev->fd); wl_list_remove(&dev->link); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.19.1/include/types/wlr_output.h new/wlroots-0.19.2/include/types/wlr_output.h --- old/wlroots-0.19.1/include/types/wlr_output.h 2025-09-21 23:03:29.000000000 +0200 +++ new/wlroots-0.19.2/include/types/wlr_output.h 2025-10-22 00:21:53.000000000 +0200 @@ -25,6 +25,7 @@ bool output_prepare_commit(struct wlr_output *output, const struct wlr_output_state *state); void output_apply_commit(struct wlr_output *output, const struct wlr_output_state *state); +void output_send_commit_event(struct wlr_output *output, const struct wlr_output_state *state); void output_state_get_buffer_src_box(const struct wlr_output_state *state, struct wlr_fbox *out); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.19.1/include/xwayland/xwm.h new/wlroots-0.19.2/include/xwayland/xwm.h --- old/wlroots-0.19.1/include/xwayland/xwm.h 2025-09-21 23:03:29.000000000 +0200 +++ new/wlroots-0.19.2/include/xwayland/xwm.h 2025-10-22 00:21:53.000000000 +0200 @@ -162,6 +162,7 @@ struct wl_listener drop_focus_destroy; }; +// xwm_create takes ownership of wm_fd and will close it under all circumstances. struct wlr_xwm *xwm_create(struct wlr_xwayland *wlr_xwayland, int wm_fd); void xwm_destroy(struct wlr_xwm *xwm); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.19.1/meson.build new/wlroots-0.19.2/meson.build --- old/wlroots-0.19.1/meson.build 2025-09-21 23:03:29.000000000 +0200 +++ new/wlroots-0.19.2/meson.build 2025-10-22 00:21:53.000000000 +0200 @@ -1,7 +1,7 @@ project( 'wlroots', 'c', - version: '0.19.1', + version: '0.19.2', license: 'MIT', meson_version: '>=1.3', default_options: [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.19.1/types/output/output.c new/wlroots-0.19.2/types/output/output.c --- old/wlroots-0.19.1/types/output/output.c 2025-09-21 23:03:29.000000000 +0200 +++ new/wlroots-0.19.2/types/output/output.c 2025-10-22 00:21:53.000000000 +0200 @@ -745,7 +745,9 @@ } output_apply_state(output, state); +} +void output_send_commit_event(struct wlr_output *output, const struct wlr_output_state *state) { struct timespec now; clock_gettime(CLOCK_MONOTONIC, &now); struct wlr_output_event_commit event = { @@ -787,6 +789,7 @@ } output_apply_commit(output, &pending); + output_send_commit_event(output, &pending); if (new_back_buffer) { wlr_buffer_unlock(pending.buffer); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.19.1/types/wlr_linux_drm_syncobj_v1.c new/wlroots-0.19.2/types/wlr_linux_drm_syncobj_v1.c --- old/wlroots-0.19.1/types/wlr_linux_drm_syncobj_v1.c 2025-09-21 23:03:29.000000000 +0200 +++ new/wlroots-0.19.2/types/wlr_linux_drm_syncobj_v1.c 2025-10-22 00:21:53.000000000 +0200 @@ -26,7 +26,7 @@ }; struct wlr_linux_drm_syncobj_surface_v1_commit { - struct wlr_linux_drm_syncobj_surface_v1 *surface; + struct wlr_surface *surface; struct wlr_drm_syncobj_timeline_waiter waiter; uint32_t cached_seq; @@ -192,7 +192,7 @@ } static void surface_commit_destroy(struct wlr_linux_drm_syncobj_surface_v1_commit *commit) { - wlr_surface_unlock_cached(commit->surface->surface, commit->cached_seq); + wlr_surface_unlock_cached(commit->surface, commit->cached_seq); wl_list_remove(&commit->surface_destroy.link); wlr_drm_syncobj_timeline_waiter_finish(&commit->waiter); free(commit); @@ -237,7 +237,7 @@ return false; } - commit->surface = surface; + commit->surface = surface->surface; commit->cached_seq = wlr_surface_lock_pending(surface->surface); commit->surface_destroy.notify = surface_commit_handle_surface_destroy; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.19.1/util/box.c new/wlroots-0.19.2/util/box.c --- old/wlroots-0.19.1/util/box.c 2025-09-21 23:03:29.000000000 +0200 +++ new/wlroots-0.19.2/util/box.c 2025-10-22 00:21:53.000000000 +0200 @@ -19,16 +19,15 @@ // // In order to be consistent with e.g. wlr_box_contains_point(), // this function returns a point inside the bottom and right edges - // of the box by at least 1/65536 of a unit (pixel). 1/65536 is + // of the box by at least 1/256 of a unit (pixel). 1/256 is // small enough to avoid a "dead zone" with high-resolution mice - // but large enough to avoid rounding to zero (due to loss of - // significant digits) in simple floating-point calculations. + // but large enough to avoid rounding to zero in wl_fixed_from_double(). // find the closest x point if (x < box->x) { *dest_x = box->x; - } else if (x > box->x + box->width - 1/65536.0) { - *dest_x = box->x + box->width - 1/65536.0; + } else if (x > box->x + box->width - 1/256.0) { + *dest_x = box->x + box->width - 1/256.0; } else { *dest_x = x; } @@ -36,8 +35,8 @@ // find closest y point if (y < box->y) { *dest_y = box->y; - } else if (y > box->y + box->height - 1/65536.0) { - *dest_y = box->y + box->height - 1/65536.0; + } else if (y > box->y + box->height - 1/256.0) { + *dest_y = box->y + box->height - 1/256.0; } else { *dest_y = y; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.19.1/xwayland/xwayland.c new/wlroots-0.19.2/xwayland/xwayland.c --- old/wlroots-0.19.1/xwayland/xwayland.c 2025-09-21 23:03:29.000000000 +0200 +++ new/wlroots-0.19.2/xwayland/xwayland.c 2025-10-22 00:21:53.000000000 +0200 @@ -42,6 +42,9 @@ static void xwayland_mark_ready(struct wlr_xwayland *xwayland) { assert(xwayland->server->wm_fd[0] >= 0); xwayland->xwm = xwm_create(xwayland, xwayland->server->wm_fd[0]); + // xwm_create takes ownership of wm_fd[0] under all circumstances + xwayland->server->wm_fd[0] = -1; + if (!xwayland->xwm) { return; } @@ -69,6 +72,11 @@ struct wlr_xwayland *xwayland = wl_container_of(listener, xwayland, shell_destroy); xwayland->shell_v1 = NULL; + wl_list_remove(&xwayland->shell_destroy.link); + // Will remove this list in handle_shell_destroy(). + // This ensures the link is always initialized and + // avoids the need to keep check conditions in sync. + wl_list_init(&xwayland->shell_destroy.link); } void wlr_xwayland_destroy(struct wlr_xwayland *xwayland) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wlroots-0.19.1/xwayland/xwm.c new/wlroots-0.19.2/xwayland/xwm.c --- old/wlroots-0.19.1/xwayland/xwm.c 2025-09-21 23:03:29.000000000 +0200 +++ new/wlroots-0.19.2/xwayland/xwm.c 2025-10-22 00:21:53.000000000 +0200 @@ -2470,6 +2470,7 @@ struct wlr_xwm *xwm_create(struct wlr_xwayland *xwayland, int wm_fd) { struct wlr_xwm *xwm = calloc(1, sizeof(*xwm)); if (xwm == NULL) { + close(wm_fd); return NULL; } @@ -2484,11 +2485,13 @@ xwm->ping_timeout = 10000; + // xcb_connect_to_fd takes ownership of the FD regardless of success/failure xwm->xcb_conn = xcb_connect_to_fd(wm_fd, NULL); int rc = xcb_connection_has_error(xwm->xcb_conn); if (rc) { wlr_log(WLR_ERROR, "xcb connect failed: %d", rc); + xcb_disconnect(xwm->xcb_conn); free(xwm); return NULL; }
