OSDN Git Service

amdgpu: replace alloca with calloc v2
authorJammy Zhou <Jammy.Zhou@amd.com>
Mon, 18 May 2015 12:57:41 +0000 (20:57 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 5 Aug 2015 17:47:49 +0000 (13:47 -0400)
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 <Jammy.Zhou@amd.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
amdgpu/amdgpu_bo.c

index d78bb9a..3dfaf62 100644 (file)
@@ -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)