This patch adds missing error-checking and fixes resource leak in allocation failure path on anv_CreateDevice()
Signed-off-by: Mun Gwan-gyeong <elong...@gmail.com> --- src/intel/vulkan/anv_device.c | 59 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 0fd7d41..1964fb7 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -893,31 +893,57 @@ VkResult anv_CreateDevice( device->robust_buffer_access = pCreateInfo->pEnabledFeatures && pCreateInfo->pEnabledFeatures->robustBufferAccess; - pthread_mutex_init(&device->mutex, NULL); + if (pthread_mutex_init(&device->mutex, NULL) != 0) { + result = vk_error(VK_ERROR_INITIALIZATION_FAILED); + goto fail_context_id; + } pthread_condattr_t condattr; - pthread_condattr_init(&condattr); - pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC); - pthread_cond_init(&device->queue_submit, NULL); + if (pthread_condattr_init(&condattr) != 0) { + result = vk_error(VK_ERROR_INITIALIZATION_FAILED); + goto fail_mutex; + } + if (pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC) != 0) { + pthread_condattr_destroy(&condattr); + result = vk_error(VK_ERROR_INITIALIZATION_FAILED); + goto fail_mutex; + } + if (pthread_cond_init(&device->queue_submit, NULL) != 0) { + pthread_condattr_destroy(&condattr); + result = vk_error(VK_ERROR_INITIALIZATION_FAILED); + goto fail_mutex; + } pthread_condattr_destroy(&condattr); anv_bo_pool_init(&device->batch_bo_pool, device); - anv_block_pool_init(&device->dynamic_state_block_pool, device, 16384); + result = anv_block_pool_init(&device->dynamic_state_block_pool, device, + 16384); + if (result != VK_SUCCESS) + goto fail_queue_submit; anv_state_pool_init(&device->dynamic_state_pool, &device->dynamic_state_block_pool); - anv_block_pool_init(&device->instruction_block_pool, device, 128 * 1024); + result = anv_block_pool_init(&device->instruction_block_pool, device, + 128 * 1024); + if (result != VK_SUCCESS) + goto fail_dynamic_state_block_pool; + anv_state_pool_init(&device->instruction_state_pool, &device->instruction_block_pool); - anv_block_pool_init(&device->surface_state_block_pool, device, 4096); + result = anv_block_pool_init(&device->surface_state_block_pool, device, + 4096); + if (result != VK_SUCCESS) + goto fail_instruction_block_pool; anv_state_pool_init(&device->surface_state_pool, &device->surface_state_block_pool); - anv_bo_init_new(&device->workaround_bo, device, 1024); + result = anv_bo_init_new(&device->workaround_bo, device, 1024); + if (result != VK_SUCCESS) + goto fail_surface_state_block_pool; anv_scratch_pool_init(device, &device->scratch_pool); @@ -942,7 +968,7 @@ VkResult anv_CreateDevice( unreachable("unhandled gen"); } if (result != VK_SUCCESS) - goto fail_fd; + goto fail_workaround_bo; anv_device_init_blorp(device); @@ -952,6 +978,21 @@ VkResult anv_CreateDevice( return VK_SUCCESS; + fail_workaround_bo: + anv_gem_munmap(device->workaround_bo.map, device->workaround_bo.size); + anv_gem_close(device, device->workaround_bo.gem_handle); + fail_surface_state_block_pool: + anv_block_pool_finish(&device->surface_state_block_pool); + fail_instruction_block_pool: + anv_block_pool_finish(&device->instruction_block_pool); + fail_dynamic_state_block_pool: + anv_block_pool_finish(&device->dynamic_state_block_pool); + fail_queue_submit: + pthread_cond_destroy(&device->queue_submit); + fail_mutex: + pthread_mutex_destroy(&device->mutex); + fail_context_id: + anv_gem_destroy_context(device, device->context_id); fail_fd: close(device->fd); fail_device: -- 2.10.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev