aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Ashworth <bosrsf04@gmail.com>2019-02-21 08:06:35 -0500
committerBrian Ashworth <bosrsf04@gmail.com>2019-02-21 08:06:35 -0500
commit03dfdb1edbfc445fe30b6456827ae93ef6c18426 (patch)
tree690007114db3d7e4bfcfeb0c1637d06c82993c08
parent546b976baa9989676c2fb2aff8c36f42b3d19810 (diff)
downloadsway-03dfdb1edbfc445fe30b6456827ae93ef6c18426.zip
sway-03dfdb1edbfc445fe30b6456827ae93ef6c18426.tar.gz
sway-03dfdb1edbfc445fe30b6456827ae93ef6c18426.tar.bz2
output_get_active_workspace: check workspaces length
If an output's node was dirty and the transaction was committed before a workspace was moved to or created for the output, the instruction would have a bad value for `state->active_workspace` due to a missing length check in `output_get_active_workspace`. If there was no focus on the output, the first workspace was being returned. If the workspace list was currently empty, the value was either garbage, or in the case of an output being disabled and re-enabled, a workspace that may have been previously freed. This just adds the length check to avoid returning out of bounds value.
-rw-r--r--sway/desktop/output.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index c5461ee..61beb7a 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -320,6 +320,9 @@ struct sway_workspace *output_get_active_workspace(struct sway_output *output) {
struct sway_seat *seat = input_manager_current_seat();
struct sway_node *focus = seat_get_active_tiling_child(seat, &output->node);
if (!focus) {
+ if (!output->workspaces->length) {
+ return NULL;
+ }
return output->workspaces->items[0];
}
return focus->sway_workspace;