aboutsummaryrefslogtreecommitdiffstats
path: root/sway/tree/container.c
diff options
context:
space:
mode:
authorLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-09-26 21:28:16 +1000
committerLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-09-26 21:33:54 +1000
commit4e4898e90f4d9b721091137a744deac335e73f12 (patch)
tree26baa780b691786d3f2eaf522a9cdc820caaa549 /sway/tree/container.c
parentMerge pull request #2712 from alexbakker/fix-crash (diff)
downloadsway-4e4898e90f4d9b721091137a744deac335e73f12.tar.gz
sway-4e4898e90f4d9b721091137a744deac335e73f12.tar.zst
sway-4e4898e90f4d9b721091137a744deac335e73f12.zip
Fix race condition crash when view unmaps + maps quickly
When a view unmaps, we start a transaction to destroy the container, then when the transaction completes we destroy the container and unset the view's container pointer. But if the view has remapped in the meantime, the view's container pointer will be pointing to a different container which should not be cleared. This adds a check to make sure the view is still pointing to the container being destroyed before clearing the pointer. The freeing of the title format is also removed as it is already freed when the view destroys in view_destroy.
Diffstat (limited to 'sway/tree/container.c')
-rw-r--r--sway/tree/container.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/sway/tree/container.c b/sway/tree/container.c
index 329145cf..baaa82fd 100644
--- a/sway/tree/container.c
+++ b/sway/tree/container.c
@@ -67,12 +67,10 @@ void container_destroy(struct sway_container *con) {
67 list_free(con->outputs); 67 list_free(con->outputs);
68 68
69 if (con->view) { 69 if (con->view) {
70 struct sway_view *view = con->view; 70 if (con->view->container == con) {
71 view->container = NULL; 71 con->view->container = NULL;
72 free(view->title_format); 72 }
73 view->title_format = NULL; 73 if (con->view->destroying) {
74
75 if (view->destroying) {
76 view_destroy(con->view); 74 view_destroy(con->view);
77 } 75 }
78 } 76 }