Without this fix, duplicated file descriptors leak into child processes. See commit aaac913e901229d11a1894f6aaf646de6b1a542c for one instance where the same fix was employed.
Cc: <mesa-sta...@lists.freedesktop.org> Signed-off-by: Matt Whitlock <freedesk...@mattwhitlock.name> --- src/egl/drivers/dri2/platform_android.c | 3 ++- src/gallium/auxiliary/vl/vl_winsys_drm.c | 3 ++- src/gallium/state_trackers/dri/dri2.c | 5 +++-- src/gallium/state_trackers/xa/xa_tracker.c | 3 ++- src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c | 3 ++- src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 3 ++- src/gallium/winsys/svga/drm/vmw_screen.c | 3 ++- src/gallium/winsys/vc4/drm/vc4_drm_winsys.c | 3 ++- src/gallium/winsys/virgl/drm/virgl_drm_winsys.c | 2 +- 9 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c index 2e0df07..f868984 100644 --- a/src/egl/drivers/dri2/platform_android.c +++ b/src/egl/drivers/dri2/platform_android.c @@ -29,6 +29,7 @@ #include <errno.h> #include <dlfcn.h> +#include <fcntl.h> #include <xf86drm.h> #if ANDROID_VERSION >= 0x402 @@ -830,7 +831,7 @@ droid_open_device(void) fd = -1; } - return (fd >= 0) ? dup(fd) : -1; + return (fd >= 0) ? fcntl(fd, F_DUPFD_CLOEXEC, 3) : -1; } /* support versions < JellyBean */ diff --git a/src/gallium/auxiliary/vl/vl_winsys_drm.c b/src/gallium/auxiliary/vl/vl_winsys_drm.c index 6a759ae..df8809c 100644 --- a/src/gallium/auxiliary/vl/vl_winsys_drm.c +++ b/src/gallium/auxiliary/vl/vl_winsys_drm.c @@ -26,6 +26,7 @@ **************************************************************************/ #include <assert.h> +#include <fcntl.h> #include "pipe/p_screen.h" #include "pipe-loader/pipe_loader.h" @@ -47,7 +48,7 @@ vl_drm_screen_create(int fd) if (!vscreen) return NULL; - if (fd < 0 || (new_fd = dup(fd)) < 0) + if (fd < 0 || (new_fd = fcntl(fd, F_DUPFD_CLOEXEC, 3)) < 0) goto free_screen; if (pipe_loader_drm_probe_fd(&vscreen->dev, new_fd)) diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index 64d9c3e..9ec069b 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -30,6 +30,7 @@ #include <xf86drm.h> #include <dlfcn.h> +#include <fcntl.h> #include "GL/mesa_glinterop.h" #include "util/u_memory.h" #include "util/u_inlines.h" @@ -1877,7 +1878,7 @@ dri2_init_screen(__DRIscreen * sPriv) sPriv->driverPrivate = (void *)screen; - if (screen->fd < 0 || (fd = dup(screen->fd)) < 0) + if (screen->fd < 0 || (fd = fcntl(screen->fd, F_DUPFD_CLOEXEC, 3)) < 0) goto free_screen; if (pipe_loader_drm_probe_fd(&screen->dev, fd)) @@ -1960,7 +1961,7 @@ dri_kms_init_screen(__DRIscreen * sPriv) sPriv->driverPrivate = (void *)screen; - if (screen->fd < 0 || (fd = dup(screen->fd)) < 0) + if (screen->fd < 0 || (fd = fcntl(screen->fd, F_DUPFD_CLOEXEC, 3)) < 0) goto free_screen; if (pipe_loader_sw_probe_kms(&screen->dev, fd)) diff --git a/src/gallium/state_trackers/xa/xa_tracker.c b/src/gallium/state_trackers/xa/xa_tracker.c index d98bd2d..03a3abf 100644 --- a/src/gallium/state_trackers/xa/xa_tracker.c +++ b/src/gallium/state_trackers/xa/xa_tracker.c @@ -27,6 +27,7 @@ */ #include <unistd.h> +#include <fcntl.h> #include "xa_tracker.h" #include "xa_priv.h" #include "pipe/p_state.h" @@ -157,7 +158,7 @@ xa_tracker_create(int drm_fd) if (!xa) return NULL; - if (drm_fd < 0 || (fd = dup(drm_fd)) < 0) + if (drm_fd < 0 || (fd = fcntl(drm_fd, F_DUPFD_CLOEXEC, 3)) < 0) goto out_no_fd; if (pipe_loader_drm_probe_fd(&xa->dev, fd)) diff --git a/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c b/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c index f90572f..cc9dfa7 100644 --- a/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c +++ b/src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c @@ -1,5 +1,6 @@ #include <sys/stat.h> #include <unistd.h> +#include <fcntl.h> #include "pipe/p_context.h" #include "pipe/p_state.h" #include "util/u_format.h" @@ -91,7 +92,7 @@ nouveau_drm_screen_create(int fd) * nouveau_device_wrap does not close the fd in case of a device * creation error. */ - dupfd = dup(fd); + dupfd = fcntl(fd, F_DUPFD_CLOEXEC, 3); ret = nouveau_drm_new(dupfd, &drm); if (ret) diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c index 16e4408..c7ceee2 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c @@ -43,6 +43,7 @@ #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> +#include <fcntl.h> #include <radeon_surface.h> #ifndef RADEON_INFO_ACTIVE_CU_COUNT @@ -751,7 +752,7 @@ radeon_drm_winsys_create(int fd, radeon_screen_create_t screen_create) return NULL; } - ws->fd = dup(fd); + ws->fd = fcntl(fd, F_DUPFD_CLOEXEC, 3); if (!do_winsys_init(ws)) goto fail1; diff --git a/src/gallium/winsys/svga/drm/vmw_screen.c b/src/gallium/winsys/svga/drm/vmw_screen.c index 74c77c5..d0bfcd7 100644 --- a/src/gallium/winsys/svga/drm/vmw_screen.c +++ b/src/gallium/winsys/svga/drm/vmw_screen.c @@ -39,6 +39,7 @@ #endif #include <sys/stat.h> #include <unistd.h> +#include <fcntl.h> static struct util_hash_table *dev_hash = NULL; @@ -88,7 +89,7 @@ vmw_winsys_create( int fd ) vws->device = stat_buf.st_rdev; vws->open_count = 1; - vws->ioctl.drm_fd = dup(fd); + vws->ioctl.drm_fd = fcntl(fd, F_DUPFD_CLOEXEC, 3); vws->base.have_gb_dma = TRUE; vws->base.need_to_rebind_resources = FALSE; diff --git a/src/gallium/winsys/vc4/drm/vc4_drm_winsys.c b/src/gallium/winsys/vc4/drm/vc4_drm_winsys.c index c5434ad..23fe8e7 100644 --- a/src/gallium/winsys/vc4/drm/vc4_drm_winsys.c +++ b/src/gallium/winsys/vc4/drm/vc4_drm_winsys.c @@ -22,6 +22,7 @@ */ #include <unistd.h> +#include <fcntl.h> #include "vc4_drm_public.h" @@ -30,5 +31,5 @@ struct pipe_screen * vc4_drm_screen_create(int fd) { - return vc4_screen_create(dup(fd)); + return vc4_screen_create(fcntl(fd, F_DUPFD_CLOEXEC, 3)); } diff --git a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c index 11385b2..86e0470 100644 --- a/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c +++ b/src/gallium/winsys/virgl/drm/virgl_drm_winsys.c @@ -867,7 +867,7 @@ virgl_drm_screen_create(int fd) virgl_screen(pscreen)->refcnt++; } else { struct virgl_winsys *vws; - int dup_fd = dup(fd); + int dup_fd = fcntl(fd, F_DUPFD_CLOEXEC, 3); vws = virgl_drm_winsys_create(dup_fd); -- 2.10.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev