auxiliary/vl/drm: fd management cleanups
authorEmil Velikov <emil.l.velikov@gmail.com>
Mon, 23 Nov 2015 20:26:58 +0000 (20:26 +0000)
committerEmil Velikov <emil.l.velikov@gmail.com>
Sun, 29 Nov 2015 14:40:26 +0000 (14:40 +0000)
Analogous to previous commit.

Spotted by Coverity (CID 1339868)

Cc: mesa-stable@lists.freedesktop.org
Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
src/gallium/auxiliary/vl/vl_winsys_drm.c

index f993e2c77279f9fa87b3e26982c3af39cec7397a..6d9d947588cbfae43e49da31a09e30aa817fd1f8 100644 (file)
@@ -41,12 +41,16 @@ struct vl_screen *
 vl_drm_screen_create(int fd)
 {
    struct vl_screen *vscreen;
+   int new_fd = -1;
 
    vscreen = CALLOC_STRUCT(vl_screen);
    if (!vscreen)
       return NULL;
 
-   if (pipe_loader_drm_probe_fd(&vscreen->dev, dup(fd)))
+   if (fd < 0 || (new_fd = dup(fd)) < 0)
+      goto error;
+
+   if (pipe_loader_drm_probe_fd(&vscreen->dev, new_fd))
       vscreen->pscreen = pipe_loader_create_screen(vscreen->dev);
 
    if (!vscreen->pscreen)
@@ -63,6 +67,8 @@ vl_drm_screen_create(int fd)
 error:
    if (vscreen->dev)
       pipe_loader_release(&vscreen->dev, 1);
+   else
+      close(new_fd);
 
    FREE(vscreen);
    return NULL;