wayland-shm: Check the size of sealed memory if ignoring SIGBUS handlers
authorDuncan McIntosh <duncan82013@live.ca>
Sun, 17 Oct 2021 00:28:34 +0000 (20:28 -0400)
committerSimon Ser <contact@emersion.fr>
Thu, 4 Nov 2021 09:02:19 +0000 (09:02 +0000)
commit20fd3b3af974c8cb0b172a97d4f47ec9c5458566
tree86a1a20c90d2f5440c7e6be544894c2b863052d6
parentebfc70cdf7c63082e2c9cccf47f0616a2e8969b0
wayland-shm: Check the size of sealed memory if ignoring SIGBUS handlers

In 11623e8f, SIGBUS handlers aren't set if F_SEAL_SHRINK is configured on
the memory. This helps avoid setting up handlers with cooperative clients;
however, if an application gives an incorrect size, the compositor would
access it anyways, figuring SIGBUS is impossible, and crash.

This can be fixed by simply removing the seal-checking logic and always
setting the signal handler. However, it seems that fstat can give the size
of the memfd, so we can check that the size we were told is within the
region. Since it's sealed to shrinking, it must never be shrunk in future,
so we can really (hopefully) ignore SIGBUS.

I was worried that fstat wasn't supported for this, but shm_overview(7) does
mention that it is a possible use.

The best solution would likely be avoiding SIGBUS entirely with
MAP_NOSIGBUS, but that hasn't been merged yet and wouldn't help systems
without it (e.g. with older kernels).

A proof-of-concept of this crash is attached with the merge request. Running
it with this patch gives an invalid-shm error, which is correct.

Signed-off-by: Duncan McIntosh <duncan82013@live.ca>
src/wayland-shm.c