diff options
author | Brian Ashworth <bosrsf04@gmail.com> | 2019-02-21 08:06:35 -0500 |
---|---|---|
committer | Brian Ashworth <bosrsf04@gmail.com> | 2019-02-21 08:06:35 -0500 |
commit | 03dfdb1edbfc445fe30b6456827ae93ef6c18426 (patch) | |
tree | 690007114db3d7e4bfcfeb0c1637d06c82993c08 | |
parent | 546b976baa9989676c2fb2aff8c36f42b3d19810 (diff) |
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.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/sway/desktop/output.c b/sway/desktop/output.c index c5461ee6..61beb7af 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; |