Fix potential crash when destroying workspace

`_container_destroy` emits a destroy event, and any listener for this
event should have access to the full container, not a half destroyed
one.

`_container_destroy` also destroys the swayc, so we have to grab a
reference to the sway_workspace so we can free it afterwards.

This also fixes a memory leak where the floating container wasn't freed.

Fixes #2092.
This commit is contained in:
Ryan Dwyer 2018-06-03 10:28:24 +10:00
parent fb932cf847
commit 8289e30308

View File

@ -204,9 +204,17 @@ static struct sway_container *container_workspace_destroy(
} }
} }
free(workspace->sway_workspace); struct sway_workspace *sway_workspace = workspace->sway_workspace;
// This emits the destroy event and also destroys the swayc.
_container_destroy(workspace); _container_destroy(workspace);
// Clean up the floating container
sway_workspace->floating->parent = NULL;
_container_destroy(sway_workspace->floating);
free(sway_workspace);
if (output) { if (output) {
output_damage_whole(output->sway_output); output_damage_whole(output->sway_output);
} }