backend/drm: add proper error handling to wlr_drm_backend_create
Some listeners weren't removed and caused a use-after-free with e.g. vkms when used as a secondary GPU.
This commit is contained in:
parent
88f65db87f
commit
eb0ce659cf
|
@ -227,7 +227,7 @@ struct wlr_backend *wlr_drm_backend_create(struct wl_display *display,
|
||||||
drm->gbm = gbm_create_device(drm->fd);
|
drm->gbm = gbm_create_device(drm->fd);
|
||||||
if (!drm->gbm) {
|
if (!drm->gbm) {
|
||||||
wlr_log(WLR_ERROR, "Failed to create GBM device");
|
wlr_log(WLR_ERROR, "Failed to create GBM device");
|
||||||
goto error_event;
|
goto error_resources;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (drm->parent) {
|
if (drm->parent) {
|
||||||
|
@ -237,7 +237,7 @@ struct wlr_backend *wlr_drm_backend_create(struct wl_display *display,
|
||||||
|
|
||||||
if (!init_drm_renderer(drm, &drm->mgpu_renderer)) {
|
if (!init_drm_renderer(drm, &drm->mgpu_renderer)) {
|
||||||
wlr_log(WLR_ERROR, "Failed to initialize renderer");
|
wlr_log(WLR_ERROR, "Failed to initialize renderer");
|
||||||
goto error_event;
|
goto error_resources;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We'll perform a multi-GPU copy for all submitted buffers, we need
|
// We'll perform a multi-GPU copy for all submitted buffers, we need
|
||||||
|
@ -247,7 +247,7 @@ struct wlr_backend *wlr_drm_backend_create(struct wl_display *display,
|
||||||
wlr_renderer_get_dmabuf_texture_formats(renderer);
|
wlr_renderer_get_dmabuf_texture_formats(renderer);
|
||||||
if (texture_formats == NULL) {
|
if (texture_formats == NULL) {
|
||||||
wlr_log(WLR_ERROR, "Failed to query renderer texture formats");
|
wlr_log(WLR_ERROR, "Failed to query renderer texture formats");
|
||||||
goto error_event;
|
goto error_mgpu_renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Force a linear layout. In case explicit modifiers aren't supported,
|
// Force a linear layout. In case explicit modifiers aren't supported,
|
||||||
|
@ -265,7 +265,7 @@ struct wlr_backend *wlr_drm_backend_create(struct wl_display *display,
|
||||||
struct wlr_renderer *renderer = wlr_backend_get_renderer(&drm->backend);
|
struct wlr_renderer *renderer = wlr_backend_get_renderer(&drm->backend);
|
||||||
struct wlr_allocator *allocator = backend_get_allocator(&drm->backend);
|
struct wlr_allocator *allocator = backend_get_allocator(&drm->backend);
|
||||||
if (renderer == NULL || allocator == NULL) {
|
if (renderer == NULL || allocator == NULL) {
|
||||||
goto error_event;
|
goto error_mgpu_renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
drm->session_destroy.notify = handle_session_destroy;
|
drm->session_destroy.notify = handle_session_destroy;
|
||||||
|
@ -276,10 +276,17 @@ struct wlr_backend *wlr_drm_backend_create(struct wl_display *display,
|
||||||
|
|
||||||
return &drm->backend;
|
return &drm->backend;
|
||||||
|
|
||||||
|
error_mgpu_renderer:
|
||||||
|
finish_drm_renderer(&drm->mgpu_renderer);
|
||||||
|
error_resources:
|
||||||
|
finish_drm_resources(drm);
|
||||||
error_event:
|
error_event:
|
||||||
wl_list_remove(&drm->session_active.link);
|
wl_list_remove(&drm->session_active.link);
|
||||||
wl_event_source_remove(drm->drm_event);
|
wl_event_source_remove(drm->drm_event);
|
||||||
error_fd:
|
error_fd:
|
||||||
|
wl_list_remove(&drm->dev_remove.link);
|
||||||
|
wl_list_remove(&drm->dev_change.link);
|
||||||
|
wl_list_remove(&drm->parent_destroy.link);
|
||||||
wlr_session_close_file(drm->session, dev);
|
wlr_session_close_file(drm->session, dev);
|
||||||
free(drm);
|
free(drm);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Reference in New Issue