From 3f1ca0f9399778d7f6599023e1a236ddef1d3458 Mon Sep 17 00:00:00 2001 From: Jammy Zhou Date: Mon, 18 May 2015 20:57:41 +0800 Subject: [PATCH] amdgpu: replace alloca with calloc v2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit use heap memory instead of stack memory to avoid potential stack overflow when a large number of resources are used for the bo_list. v2: some minor improvement Signed-off-by: Jammy Zhou Reviewed-by: Michel Dänzer Reviewed-by: Christian König --- amdgpu/amdgpu_bo.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c index d78bb9a8..3dfaf62f 100644 --- a/amdgpu/amdgpu_bo.c +++ b/amdgpu/amdgpu_bo.c @@ -666,7 +666,10 @@ int amdgpu_bo_list_create(amdgpu_device_handle dev, unsigned i; int r; - list = alloca(sizeof(struct drm_amdgpu_bo_list_entry) * number_of_resources); + list = calloc(number_of_resources, sizeof(struct drm_amdgpu_bo_list_entry)); + + if (list == NULL) + return -ENOMEM; memset(&args, 0, sizeof(args)); args.in.operation = AMDGPU_BO_LIST_OP_CREATE; @@ -685,12 +688,14 @@ int amdgpu_bo_list_create(amdgpu_device_handle dev, r = drmCommandWriteRead(dev->fd, DRM_AMDGPU_BO_LIST, &args, sizeof(args)); if (r) - return r; + goto out; *result = calloc(1, sizeof(struct amdgpu_bo_list)); (*result)->dev = dev; (*result)->handle = args.out.list_handle; - return 0; +out: + free(list); + return r; } int amdgpu_bo_list_destroy(amdgpu_bo_list_handle list)