Commit 083164db authored by Nirmoy Das's avatar Nirmoy Das Committed by Alex Deucher
Browse files

drm/amdgpu: fix memory leak



cleanup error handling code and make sure temporary info array
with the handles are freed by amdgpu_bo_list_put() on
idr_replace()'s failure.

Signed-off-by: default avatarNirmoy Das <nirmoy.das@amd.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent da0c9ea1
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -270,7 +270,7 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,

	r = amdgpu_bo_create_list_entry_array(&args->in, &info);
	if (r)
		goto error_free;
		return r;

	switch (args->in.operation) {
	case AMDGPU_BO_LIST_OP_CREATE:
@@ -283,8 +283,7 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
		r = idr_alloc(&fpriv->bo_list_handles, list, 1, 0, GFP_KERNEL);
		mutex_unlock(&fpriv->bo_list_lock);
		if (r < 0) {
			amdgpu_bo_list_put(list);
			return r;
			goto error_put_list;
		}

		handle = r;
@@ -306,9 +305,8 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
		mutex_unlock(&fpriv->bo_list_lock);

		if (IS_ERR(old)) {
			amdgpu_bo_list_put(list);
			r = PTR_ERR(old);
			goto error_free;
			goto error_put_list;
		}

		amdgpu_bo_list_put(old);
@@ -325,8 +323,10 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,

	return 0;

error_put_list:
	amdgpu_bo_list_put(list);

error_free:
	if (info)
	kvfree(info);
	return r;
}