shm: get_buffer(): make sure buffer->busy is set

When going through the cached buffers, we only set buffer->busy on
the *first* re-usable buffer we found.

In some cases, we will find more than one re-usable buffer. In this
case, we select the “youngest” one (i.e the one most recently used, in
the hopes that we can use damage tracking instead of re-rendering the
entire buffer).

If the “current” buffer is younger than the previously detected,
re-usable, buffer, then we unref:ed the previously selected buffer,
and replaced it with the current one.

But, we did not sanitize it. That is, we did not:

* set buffer->busy
* clear its dirty region
* clear its scroll damage

That buffer would eventually get rendered to, and committed to the
compositor. Later, the compositor would free it. And there, in our
buffer_release() callback, we’d assert that buffer->busy was
set. And fail.

Closes #844
This commit is contained in:
Daniel Eklöf 2021-12-15 12:37:21 +01:00
parent fb398f473e
commit fc6533c920
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 21 additions and 10 deletions

View file

@ -60,6 +60,8 @@
(https://codeberg.org/dnkl/foot/issues/842).
* Key presses triggering keyboard layout switches also being emitted
CSI codes in the Kitty keyboard protocol.
* Assertion in `shm.c:buffer_release()`
(https://codeberg.org/dnkl/foot/issues/844).
### Security