input: ignore pointer motion events on unknown surfaces

In some cases, the compositor sends a pointer enter event with a NULL
surface. It’s unclear if this is a compositor bug, or a race (where
the compositor sends an enter event on a CSD surface at the same time
foot unmaps the CSDs). Regardless, this causes seat->mouse_focus to be
unset, which triggers a crash in foot on the next pointer motion
event.

This patch does two things:

a) log a warning when we receive a pointer event with a NULL surface
b) ignore motion events where seat->mouse_focus is NULL
This commit is contained in:
Daniel Eklöf 2022-08-12 16:13:25 +02:00
parent eafff70439
commit 45803791cf
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 15 additions and 4 deletions

View file

@ -52,6 +52,9 @@
### Fixed
* Compiling against wayland-protocols < 1.25
* Crash on buggy compositors (GNOME) that sometimes send pointer-enter
events with a NULL surface. Foot now ignores these events, and the
subsequent motion and leave events.
### Security

16
input.c
View file

@ -1709,11 +1709,9 @@ wl_pointer_enter(void *data, struct wl_pointer *wl_pointer,
uint32_t serial, struct wl_surface *surface,
wl_fixed_t surface_x, wl_fixed_t surface_y)
{
xassert(surface != NULL);
xassert(serial != 0);
if (surface == NULL) {
if (unlikely(surface == NULL)) {
/* Seen on mutter-3.38 */
LOG_WARN("compositor sent pointer_enter event with a NULL surface");
return;
}
@ -1866,6 +1864,16 @@ wl_pointer_motion(void *data, struct wl_pointer *wl_pointer,
struct seat *seat = data;
struct wayland *wayl = seat->wayl;
struct terminal *term = seat->mouse_focus;
if (unlikely(term == NULL)) {
/* Typically happens when the compositor sent a pointer enter
* event with a NULL surface - see wl_pointer_enter().
*
* In this case, we never set seat->mouse_focus (since we
* cant map the enter event to a specific window). */
return;
}
struct wl_window *win = term->window;
LOG_DBG("pointer_motion: pointer=%p, x=%d, y=%d", (void *)wl_pointer,