diff options
author | emersion <contact@emersion.fr> | 2018-12-04 18:56:29 +0100 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2018-12-04 18:56:29 +0100 |
commit | 491f1dbf75d07f6a940d9792eb74ff871606e7b0 (patch) | |
tree | 06b570100634801a254d105e8fda02437b108b87 /backend | |
parent | 3efc6bc363b4200d9cd73e76a7e95778595f5049 (diff) |
backend/drm: fix VLA overflow
Diffstat (limited to 'backend')
-rw-r--r-- | backend/drm/drm.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/backend/drm/drm.c b/backend/drm/drm.c index c2186932..97028dc7 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -428,6 +428,19 @@ bool enable_drm_connector(struct wlr_output *output, bool enable) { return true; } +static ssize_t connector_index_from_crtc(struct wlr_drm_backend *drm, + struct wlr_drm_crtc *crtc) { + size_t i = 0; + struct wlr_drm_connector *conn; + wl_list_for_each(conn, &drm->outputs, link) { + if (conn->crtc == crtc) { + return i; + } + ++i; + } + return -1; +} + static void realloc_planes(struct wlr_drm_backend *drm, const uint32_t *crtc_in, bool *changed_outputs) { wlr_log(WLR_DEBUG, "Reallocating planes"); @@ -477,7 +490,10 @@ static void realloc_planes(struct wlr_drm_backend *drm, const uint32_t *crtc_in, type, c->id); - changed_outputs[crtc_res[i]] = true; + ssize_t conn_idx = connector_index_from_crtc(drm, c); + if (conn_idx >= 0) { + changed_outputs[conn_idx] = true; + } if (*old) { finish_drm_surface(&(*old)->surf); } |