diff options
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo.c | 4 | ||||
| -rw-r--r-- | include/drm/ttm/ttm_bo_api.h | 4 | 
2 files changed, 8 insertions, 0 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index ce464579c485..3ca77dc03915 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -1144,6 +1144,10 @@ int ttm_bo_init(struct ttm_bo_device *bdev,  	num_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;  	if (num_pages == 0) {  		printk(KERN_ERR TTM_PFX "Illegal buffer object size.\n"); +		if (destroy) +			(*destroy)(bo); +		else +			kfree(bo);  		return -EINVAL;  	}  	bo->destroy = destroy; diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h index 5afa5b52063e..beafc156a535 100644 --- a/include/drm/ttm/ttm_bo_api.h +++ b/include/drm/ttm/ttm_bo_api.h @@ -432,6 +432,10 @@ extern void ttm_bo_synccpu_write_release(struct ttm_buffer_object *bo);   * together with the @destroy function,   * enables driver-specific objects derived from a ttm_buffer_object.   * On successful return, the object kref and list_kref are set to 1. + * If a failure occurs, the function will call the @destroy function, or + * kfree() if @destroy is NULL. Thus, after a failure, dereferencing @bo is + * illegal and will likely cause memory corruption. + *   * Returns   * -ENOMEM: Out of memory.   * -EINVAL: Invalid placement flags.  | 
