rootston exit: fix drm destroy

wlr_drm_connector were being freed without removing them
from the drm->outputs list, segfaulting on destroy
master
Dominique Martinet 7 years ago
parent 1d0973f6c8
commit f451ea3639

@ -29,8 +29,8 @@ static void wlr_drm_backend_destroy(struct wlr_backend *backend) {
wlr_drm_restore_outputs(drm); wlr_drm_restore_outputs(drm);
struct wlr_drm_connector *conn; struct wlr_drm_connector *conn, *next;
wl_list_for_each(conn, &drm->outputs, link) { wl_list_for_each_safe(conn, next, &drm->outputs, link) {
wlr_output_destroy(&conn->output); wlr_output_destroy(&conn->output);
} }

@ -645,6 +645,7 @@ static void wlr_drm_connector_destroy(struct wlr_output *output) {
struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output; struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output;
wlr_drm_connector_cleanup(conn); wlr_drm_connector_cleanup(conn);
wl_event_source_remove(conn->retry_pageflip); wl_event_source_remove(conn->retry_pageflip);
wl_list_remove(&conn->link);
free(conn); free(conn);
} }
@ -823,6 +824,7 @@ void wlr_drm_scan_connectors(struct wlr_drm_backend *drm) {
drmModeFreeCrtc(conn->old_crtc); drmModeFreeCrtc(conn->old_crtc);
wl_event_source_remove(conn->retry_pageflip); wl_event_source_remove(conn->retry_pageflip);
wl_list_remove(&conn->link);
free(conn); free(conn);
} }
} }

Loading…
Cancel
Save