From 9d75c551465fa3dbb3cd20ae87d6de294fcebce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 28 Jul 2023 15:32:42 +0200 Subject: [PATCH] wayland: don't try to use a non-existing viewporter interface When instantiating the viewport for a pointer surface, we didn't first check if the compositor implements the viewporter interface. This triggered a crash when a) foot was compiled with fractional scaling, and b) the compositor did not implement the viewporter interface. Closes #1444 --- CHANGELOG.md | 3 +++ wayland.c | 24 ++++++++++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26f1d1fe..a60ccef5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,10 +69,13 @@ * Regression: line- and box drawing characters not covering the full height of the line, when a custom `line-height` is being used ([#1430][1430]). +* Crash when compositor does not implement the _viewporter_ interface + ([#1444][1444]). [1423]: https://codeberg.org/dnkl/foot/issues/1423 [1431]: https://codeberg.org/dnkl/foot/issues/1431 [1430]: https://codeberg.org/dnkl/foot/issues/1430 +[1444]: https://codeberg.org/dnkl/foot/issues/1444 ### Security diff --git a/wayland.c b/wayland.c index acf078aa..9a6609f4 100644 --- a/wayland.c +++ b/wayland.c @@ -315,15 +315,17 @@ seat_handle_capabilities(void *data, struct wl_seat *wl_seat, } #if defined(HAVE_FRACTIONAL_SCALE) - xassert(seat->pointer.surface.viewport == NULL); - seat->pointer.surface.viewport = wp_viewporter_get_viewport( - seat->wayl->viewporter, seat->pointer.surface.surf); + if (seat->wayl->viewporter != NULL) { + xassert(seat->pointer.surface.viewport == NULL); + seat->pointer.surface.viewport = wp_viewporter_get_viewport( + seat->wayl->viewporter, seat->pointer.surface.surf); - if (seat->pointer.surface.viewport == NULL) { - LOG_ERR("%s: failed to create pointer viewport", seat->name); - wl_surface_destroy(seat->pointer.surface.surf); - seat->pointer.surface.surf = NULL; - return; + if (seat->pointer.surface.viewport == NULL) { + LOG_ERR("%s: failed to create pointer viewport", seat->name); + wl_surface_destroy(seat->pointer.surface.surf); + seat->pointer.surface.surf = NULL; + return; + } } #endif @@ -351,8 +353,10 @@ seat_handle_capabilities(void *data, struct wl_seat *wl_seat, wl_surface_destroy(seat->pointer.surface.surf); #if defined(HAVE_FRACTIONAL_SCALE) - wp_viewport_destroy(seat->pointer.surface.viewport); - seat->pointer.surface.viewport = NULL; + if (seat->pointer.surface.viewport != NULL) { + wp_viewport_destroy(seat->pointer.surface.viewport); + seat->pointer.surface.viewport = NULL; + } #endif if (seat->pointer.theme != NULL)