drm/radeon: fix error handling in radeon_driver_open_kms
commit 4722f463896cc0ef1a6f1c3cb2e171e949831249 upstream. The return value was never initialized so the cleanup code executed when it isn't even necessary. Just add proper error handling. Fixes: ab50cb9df889 ("drm/radeon/radeon_kms: Fix a NULL pointer dereference in radeon_driver_open_kms()") Signed-off-by: Christian König <christian.koenig@amd.com> Tested-by: Jan Stancek <jstancek@redhat.com> Tested-by: Borislav Petkov <bp@suse.de> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
d820cb6365
commit
227afbfe47
@ -652,18 +652,18 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
|
||||
fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL);
|
||||
if (unlikely(!fpriv)) {
|
||||
r = -ENOMEM;
|
||||
goto out_suspend;
|
||||
goto err_suspend;
|
||||
}
|
||||
|
||||
if (rdev->accel_working) {
|
||||
vm = &fpriv->vm;
|
||||
r = radeon_vm_init(rdev, vm);
|
||||
if (r)
|
||||
goto out_fpriv;
|
||||
goto err_fpriv;
|
||||
|
||||
r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false);
|
||||
if (r)
|
||||
goto out_vm_fini;
|
||||
goto err_vm_fini;
|
||||
|
||||
/* map the ib pool buffer read only into
|
||||
* virtual address space */
|
||||
@ -671,7 +671,7 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
|
||||
rdev->ring_tmp_bo.bo);
|
||||
if (!vm->ib_bo_va) {
|
||||
r = -ENOMEM;
|
||||
goto out_vm_fini;
|
||||
goto err_vm_fini;
|
||||
}
|
||||
|
||||
r = radeon_vm_bo_set_addr(rdev, vm->ib_bo_va,
|
||||
@ -679,19 +679,21 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
|
||||
RADEON_VM_PAGE_READABLE |
|
||||
RADEON_VM_PAGE_SNOOPED);
|
||||
if (r)
|
||||
goto out_vm_fini;
|
||||
goto err_vm_fini;
|
||||
}
|
||||
file_priv->driver_priv = fpriv;
|
||||
}
|
||||
|
||||
if (!r)
|
||||
goto out_suspend;
|
||||
pm_runtime_mark_last_busy(dev->dev);
|
||||
pm_runtime_put_autosuspend(dev->dev);
|
||||
return 0;
|
||||
|
||||
out_vm_fini:
|
||||
err_vm_fini:
|
||||
radeon_vm_fini(rdev, vm);
|
||||
out_fpriv:
|
||||
err_fpriv:
|
||||
kfree(fpriv);
|
||||
out_suspend:
|
||||
|
||||
err_suspend:
|
||||
pm_runtime_mark_last_busy(dev->dev);
|
||||
pm_runtime_put_autosuspend(dev->dev);
|
||||
return r;
|
||||
|
Loading…
Reference in New Issue
Block a user