gallium/winsys: replace calls to dup(2) with fcntl(F_DUPFD_CLOEXEC)
authorMatt Whitlock <freedesktop@mattwhitlock.name>
Sun, 2 Oct 2016 03:49:45 +0000 (23:49 -0400)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Tue, 4 Oct 2016 09:09:03 +0000 (11:09 +0200)
Without this fix, duplicated file descriptors leak into child processes.
See commit aaac913e901229d11a1894f6aaf646de6b1a542c for one instance
where the same fix was employed.

Cc: <mesa-stable@lists.freedesktop.org>
Signed-off-by: Matt Whitlock <freedesktop@mattwhitlock.name>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/winsys/nouveau/drm/nouveau_drm_winsys.c
src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
src/gallium/winsys/svga/drm/vmw_screen.c
src/gallium/winsys/vc4/drm/vc4_drm_winsys.c
src/gallium/winsys/virgl/drm/virgl_drm_winsys.c

index f90572f2f487d3149c61b02101a2c63251d3ba55..cc9dfa7f7645c8c201c5fd113ba80041ba3a76d7 100644 (file)
@@ -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)
index 16e4408a9a7e05dfd1ea7d2dd03eb9a3f26376f0..c7ceee250b8cf58c6d571a757bbffd0b877711b9 100644 (file)
@@ -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;
index 74c77c54e847e68b17e1ea8aae726554b438a446..d0bfcd728bf68f5d4bd5c1567615008ff61504ed 100644 (file)
@@ -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;
 
index c5434adbb437c6a5d9986019e771046800ca42f2..23fe8e7b9cf5bd38e84b6aa4cb19fe4179ebbe96 100644 (file)
@@ -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));
 }
index 11385b2faae42d2516fee549ee091c69ce1c9bd2..86e0470e682be791288c0ca2611a139586ca16c8 100644 (file)
@@ -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);