viewporter: fix src buffer bounds check

The surface scale and transform are applied before the viewport.

Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3766
(cherry picked from commit 4fbe648faf)
This commit is contained in:
Simon Ser 2023-11-24 17:00:34 +01:00 committed by Simon Zeni
parent f070bab7db
commit b05fef20ff

View file

@ -131,6 +131,19 @@ static void viewport_handle_resource_destroy(struct wl_resource *resource) {
viewport_destroy(viewport); viewport_destroy(viewport);
} }
static bool check_src_buffer_bounds(const struct wlr_surface_state *state) {
int width = state->buffer_width / state->scale;
int height = state->buffer_height / state->scale;
if (state->transform & WL_OUTPUT_TRANSFORM_90) {
int tmp = width;
width = height;
height = tmp;
}
struct wlr_fbox box = state->viewport.src;
return box.x + box.width <= width && box.y + box.height <= height;
}
static void viewport_handle_surface_client_commit(struct wl_listener *listener, static void viewport_handle_surface_client_commit(struct wl_listener *listener,
void *data) { void *data) {
struct wlr_viewport *viewport = struct wlr_viewport *viewport =
@ -148,10 +161,7 @@ static void viewport_handle_surface_client_commit(struct wl_listener *listener,
} }
if (state->viewport.has_src && state->buffer != NULL && if (state->viewport.has_src && state->buffer != NULL &&
(state->viewport.src.x + state->viewport.src.width > !check_src_buffer_bounds(state)) {
state->buffer_width ||
state->viewport.src.y + state->viewport.src.height >
state->buffer_height)) {
wl_resource_post_error(viewport->resource, WP_VIEWPORT_ERROR_OUT_OF_BUFFER, wl_resource_post_error(viewport->resource, WP_VIEWPORT_ERROR_OUT_OF_BUFFER,
"source rectangle out of buffer bounds"); "source rectangle out of buffer bounds");
return; return;