summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Simon Ser <contact@emersion.fr>2019-08-31 23:19:47 +0300
committerLibravatar Drew DeVault <sir@cmpwn.com>2019-09-01 09:58:03 +0900
commit53e01bf5c7763b5f49ce15b05f6b32f986e2b2ba (patch)
tree3eeb285b3f4bb0e434df4db66638cdf35ebf4945
parentEnsure that seat->focused_layer is cleared on unmap (diff)
downloadsway-53e01bf5c7763b5f49ce15b05f6b32f986e2b2ba.tar.gz
sway-53e01bf5c7763b5f49ce15b05f6b32f986e2b2ba.tar.zst
sway-53e01bf5c7763b5f49ce15b05f6b32f986e2b2ba.zip
layer-shell: don't give focus to unmapped layer surfaces
Focused layers are not cleared when destroyed, they are cleared on unmap. Giving focus to an unmapped layer surface is (1) incorrect and (2) triggers a use-after-free. Closes: https://github.com/swaywm/sway/issues/4517
-rw-r--r--sway/desktop/layer_shell.c3
-rw-r--r--sway/input/seat.c1
2 files changed, 3 insertions, 1 deletions
diff --git a/sway/desktop/layer_shell.c b/sway/desktop/layer_shell.c
index 60270a42..c881919d 100644
--- a/sway/desktop/layer_shell.c
+++ b/sway/desktop/layer_shell.c
@@ -200,7 +200,8 @@ void arrange_layers(struct sway_output *output) {
200 for (size_t i = 0; i < nlayers; ++i) { 200 for (size_t i = 0; i < nlayers; ++i) {
201 wl_list_for_each_reverse(layer, 201 wl_list_for_each_reverse(layer,
202 &output->layers[layers_above_shell[i]], link) { 202 &output->layers[layers_above_shell[i]], link) {
203 if (layer->layer_surface->current.keyboard_interactive) { 203 if (layer->layer_surface->current.keyboard_interactive &&
204 layer->layer_surface->mapped) {
204 topmost = layer; 205 topmost = layer;
205 break; 206 break;
206 } 207 }
diff --git a/sway/input/seat.c b/sway/input/seat.c
index 4da8e937..b2243fe3 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -1095,6 +1095,7 @@ void seat_set_focus_layer(struct sway_seat *seat,
1095 } else if (!layer || seat->focused_layer == layer) { 1095 } else if (!layer || seat->focused_layer == layer) {
1096 return; 1096 return;
1097 } 1097 }
1098 assert(layer->mapped);
1098 seat_set_focus_surface(seat, layer->surface, true); 1099 seat_set_focus_surface(seat, layer->surface, true);
1099 if (layer->layer >= ZWLR_LAYER_SHELL_V1_LAYER_TOP) { 1100 if (layer->layer >= ZWLR_LAYER_SHELL_V1_LAYER_TOP) {
1100 seat->focused_layer = layer; 1101 seat->focused_layer = layer;