diff --git a/src/gallium/drivers/llvmpipe/lp_fence.c b/src/gallium/drivers/llvmpipe/lp_fence.c index 81ce55f7845..43777502d0a 100644 --- a/src/gallium/drivers/llvmpipe/lp_fence.c +++ b/src/gallium/drivers/llvmpipe/lp_fence.c @@ -294,10 +294,15 @@ lp_create_fence_fd(struct pipe_context *pipe, if (!f) goto fail; + f->sync_fd = os_dupfd_cloexec(fd); + if (f->sync_fd < 0) { + free(f); + goto fail; + } + pipe_reference_init(&f->reference, 1); f->type = LP_FENCE_TYPE_SYNC_FD; f->id = p_atomic_inc_return(&fence_id) - 1; - f->sync_fd = os_dupfd_cloexec(fd); f->issued = true; *fence = (struct pipe_fence_handle*)f; diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c index 7405f99158e..be44a89f486 100644 --- a/src/gallium/drivers/llvmpipe/lp_texture.c +++ b/src/gallium/drivers/llvmpipe/lp_texture.c @@ -852,7 +852,10 @@ llvmpipe_resource_get_handle(struct pipe_screen *_screen, /* reuse lavapipe codepath to handle destruction */ lpr->backable = true; } else { + assert(lpr->dmabuf_alloc->fd >= 0); whandle->handle = os_dupfd_cloexec(lpr->dmabuf_alloc->fd); + if (whandle->handle < 0) + return false; } whandle->modifier = DRM_FORMAT_MOD_LINEAR; whandle->stride = lpr->row_stride[0]; @@ -1460,8 +1463,15 @@ llvmpipe_allocate_memory_fd(struct pipe_screen *pscreen, alloc->type = LLVMPIPE_MEMORY_FD_TYPE_DMA_BUF; alloc->cpu_addr = llvmpipe_resource_alloc_udmabuf(screen, alloc, size); - if (alloc->cpu_addr) + if (alloc->cpu_addr) { *fd = os_dupfd_cloexec(alloc->fd); + if (*fd < 0) { + close(alloc->mem_fd); + close(alloc->fd); + FREE(alloc); + goto fail; + } + } } else #endif { @@ -1517,6 +1527,13 @@ llvmpipe_import_memory_fd(struct pipe_screen *screen, alloc->cpu_addr = cpu_addr; alloc->size = mmap_size; alloc->fd = os_dupfd_cloexec(fd); + if (alloc->fd < 0) { + munmap(alloc->cpu_addr, alloc->size); + free(alloc); + *ptr = NULL; + return false; + } + *ptr = (struct pipe_memory_allocation*)alloc; *size = mmap_size;