Skip to content

Commit 8a53e29

Browse files
drobson-imgtecmripard
authored andcommitted
drm/imagination: Fix error path in pvr_vm_create_context
It is possible to double free the vm_ctx->mmu_ctx object in this function.     630 err_page_table_destroy: --> 631         pvr_mmu_context_destroy(vm_ctx->mmu_ctx); The pvr_vm_context_put() function does:         kref_put(&vm_ctx->ref_count, pvr_vm_context_release); Here the pvr_vm_context_release() will call:         pvr_mmu_context_destroy(vm_ctx->mmu_ctx); Refactor to an unwind style. Reported-by: Dan Carpenter <dan.carpenter@linaro.org> Signed-off-by: Donald Robson <donald.robson@imgtec.com> Reviewed-by: Dan Carpenter <dan.carpenter@linaro.org> Signed-off-by: Maxime Ripard <mripard@kernel.org> Link: https://patchwork.freedesktop.org/patch/msgid/20231213144431.94956-2-donald.robson@imgtec.com
1 parent f175498 commit 8a53e29

File tree

1 file changed

+13
-15
lines changed

1 file changed

+13
-15
lines changed

drivers/gpu/drm/imagination/pvr_vm.c

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -556,23 +556,12 @@ pvr_vm_create_context(struct pvr_device *pvr_dev, bool is_userspace_context)
556556
if (!vm_ctx)
557557
return ERR_PTR(-ENOMEM);
558558

559-
drm_gem_private_object_init(&pvr_dev->base, &vm_ctx->dummy_gem, 0);
560-
561559
vm_ctx->pvr_dev = pvr_dev;
562-
kref_init(&vm_ctx->ref_count);
563-
mutex_init(&vm_ctx->lock);
564-
565-
drm_gpuvm_init(&vm_ctx->gpuvm_mgr,
566-
is_userspace_context ? "PowerVR-user-VM" : "PowerVR-FW-VM",
567-
0, &pvr_dev->base, &vm_ctx->dummy_gem,
568-
0, 1ULL << device_addr_bits, 0, 0, &pvr_vm_gpuva_ops);
569560

570561
vm_ctx->mmu_ctx = pvr_mmu_context_create(pvr_dev);
571562
err = PTR_ERR_OR_ZERO(vm_ctx->mmu_ctx);
572-
if (err) {
573-
vm_ctx->mmu_ctx = NULL;
574-
goto err_put_ctx;
575-
}
563+
if (err)
564+
goto err_free;
576565

577566
if (is_userspace_context) {
578567
err = pvr_fw_object_create(pvr_dev, sizeof(struct rogue_fwif_fwmemcontext),
@@ -583,13 +572,22 @@ pvr_vm_create_context(struct pvr_device *pvr_dev, bool is_userspace_context)
583572
goto err_page_table_destroy;
584573
}
585574

575+
drm_gem_private_object_init(&pvr_dev->base, &vm_ctx->dummy_gem, 0);
576+
drm_gpuvm_init(&vm_ctx->gpuvm_mgr,
577+
is_userspace_context ? "PowerVR-user-VM" : "PowerVR-FW-VM",
578+
0, &pvr_dev->base, &vm_ctx->dummy_gem,
579+
0, 1ULL << device_addr_bits, 0, 0, &pvr_vm_gpuva_ops);
580+
581+
mutex_init(&vm_ctx->lock);
582+
kref_init(&vm_ctx->ref_count);
583+
586584
return vm_ctx;
587585

588586
err_page_table_destroy:
589587
pvr_mmu_context_destroy(vm_ctx->mmu_ctx);
590588

591-
err_put_ctx:
592-
pvr_vm_context_put(vm_ctx);
589+
err_free:
590+
kfree(vm_ctx);
593591

594592
return ERR_PTR(err);
595593
}

0 commit comments

Comments
 (0)