url-mode: purge SHM pixmaps when destroying URLs

Unlike other surface types, the SHM cookie depends on the address of
each URL instance. This means if we enable, disable, and then enable
URL mode again (thus showing exactly the same URLs as the first time),
the URLs will have new addresses, and thus the old SHM pixmaps will
not get purged automatically.

So, manually purge them when destroying the URLs.
This commit is contained in:
Daniel Eklöf 2021-07-11 09:54:04 +02:00
parent 24dd44634a
commit 0a6e7e6167
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 10 additions and 0 deletions

View file

@ -49,6 +49,8 @@
`tweak.allow-overflowing-double-width-glyphs`.
* Regression: crash when a single-char, double-width glyph is in the
last column, and `tweak.allow-overflowing-double-width-glyphs=yes`.
* FD exhaustion when repeatedly entering/exiting URL mode with many
URLs.
### Security

View file

@ -14,6 +14,7 @@
#include "grid.h"
#include "render.h"
#include "selection.h"
#include "shm.h"
#include "spawn.h"
#include "terminal.h"
#include "uri.h"
@ -728,7 +729,9 @@ urls_reset(struct terminal *term)
if (term->window != NULL) {
tll_foreach(term->window->urls, it) {
const struct url *url = it->item.url;
wayl_win_subsurface_destroy(&it->item.surf);
shm_purge(term->wl->shm, shm_cookie_url(url));
tll_remove(term->window->urls, it);
}
}

View file

@ -26,6 +26,7 @@
#include "input.h"
#include "render.h"
#include "selection.h"
#include "shm.h"
#include "util.h"
#include "xmalloc.h"
@ -1410,6 +1411,9 @@ wayl_win_destroy(struct wl_window *win)
if (win == NULL)
return;
struct terminal *term = win->term;
struct wl_shm *shm = term->wl->shm;
if (win->csd.move_timeout_fd != -1)
close(win->csd.move_timeout_fd);
@ -1457,6 +1461,7 @@ wayl_win_destroy(struct wl_window *win)
tll_foreach(win->urls, it) {
wayl_win_subsurface_destroy(&it->item.surf);
shm_purge(shm, shm_cookie_url(it->item.url));
tll_remove(win->urls, it);
}