habanalabs: Avoid double free in error flow
In case kernel context init fails during device initialization, both hl_ctx_put() and kfree() are called, ending with a double free of the kernel context. Calling kfree() is needed only when a failure happens between the allocation of the kernel context and its initialization, so move it to there and remove it from the error flow. Signed-off-by: Tomer Tayar <ttayar@habana.ai> Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com> Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
This commit is contained in:
parent
d45331b00d
commit
508c5849c6
@ -970,7 +970,8 @@ int hl_device_init(struct hl_device *hdev, struct class *hclass)
|
|||||||
rc = hl_ctx_init(hdev, hdev->kernel_ctx, true);
|
rc = hl_ctx_init(hdev, hdev->kernel_ctx, true);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
dev_err(hdev->dev, "failed to initialize kernel context\n");
|
dev_err(hdev->dev, "failed to initialize kernel context\n");
|
||||||
goto free_ctx;
|
kfree(hdev->kernel_ctx);
|
||||||
|
goto mmu_fini;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = hl_cb_pool_init(hdev);
|
rc = hl_cb_pool_init(hdev);
|
||||||
@ -1053,8 +1054,6 @@ release_ctx:
|
|||||||
if (hl_ctx_put(hdev->kernel_ctx) != 1)
|
if (hl_ctx_put(hdev->kernel_ctx) != 1)
|
||||||
dev_err(hdev->dev,
|
dev_err(hdev->dev,
|
||||||
"kernel ctx is still alive on initialization failure\n");
|
"kernel ctx is still alive on initialization failure\n");
|
||||||
free_ctx:
|
|
||||||
kfree(hdev->kernel_ctx);
|
|
||||||
mmu_fini:
|
mmu_fini:
|
||||||
hl_mmu_fini(hdev);
|
hl_mmu_fini(hdev);
|
||||||
eq_fini:
|
eq_fini:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user