From c85789a3a9f6f851e6fbc900495057ba91b3e255 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 29 Apr 2021 09:12:45 +0200 Subject: [PATCH] backend/headless: dup DRM FD in wlr_headless_backend_create_with_renderer We were not dup'ing the DRM FD coming from wlr_renderer_get_drm_fd, resulting in a double-close on backend destroy. --- backend/headless/backend.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/backend/headless/backend.c b/backend/headless/backend.c index be44a980..2617b812 100644 --- a/backend/headless/backend.c +++ b/backend/headless/backend.c @@ -248,9 +248,15 @@ struct wlr_backend *wlr_headless_backend_create_with_renderer( } backend->has_parent_renderer = true; - backend->drm_fd = wlr_renderer_get_drm_fd(renderer); - if (backend->drm_fd < 0) { - wlr_log(WLR_ERROR, "Failed to get DRM device FD from renderer"); + int drm_fd = wlr_renderer_get_drm_fd(renderer); + if (drm_fd < 0) { + wlr_log(WLR_ERROR, "Failed to get DRM device FD from parent renderer"); + backend->drm_fd = -1; + } else { + backend->drm_fd = fcntl(drm_fd, F_DUPFD_CLOEXEC, 0); + if (backend->drm_fd < 0) { + wlr_log_errno(WLR_ERROR, "fcntl(F_DUPFD_CLOEXEC) failed"); + } } if (!backend_init(backend, display, renderer)) {