diff options
Diffstat (limited to 'drivers/gpu/drm/virtio/virtgpu_ioctl.c')
| -rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_ioctl.c | 19 | 
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index 5d05093014ac..9f4a90493aea 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -358,10 +358,18 @@ static int virtio_gpu_resource_create_ioctl(struct drm_device *dev, void *data,  		drm_gem_object_release(obj);  		return ret;  	} -	drm_gem_object_put(obj);  	rc->res_handle = qobj->hw_res_handle; /* similiar to a VM address */  	rc->bo_handle = handle; + +	/* +	 * The handle owns the reference now.  But we must drop our +	 * remaining reference *after* we no longer need to dereference +	 * the obj.  Otherwise userspace could guess the handle and +	 * race closing it from another thread. +	 */ +	drm_gem_object_put(obj); +  	return 0;  } @@ -723,11 +731,18 @@ static int virtio_gpu_resource_create_blob_ioctl(struct drm_device *dev,  		drm_gem_object_release(obj);  		return ret;  	} -	drm_gem_object_put(obj);  	rc_blob->res_handle = bo->hw_res_handle;  	rc_blob->bo_handle = handle; +	/* +	 * The handle owns the reference now.  But we must drop our +	 * remaining reference *after* we no longer need to dereference +	 * the obj.  Otherwise userspace could guess the handle and +	 * race closing it from another thread. +	 */ +	drm_gem_object_put(obj); +  	return 0;  }  | 
