Commit 508c5849 authored by Tomer Tayar's avatar Tomer Tayar Committed by Oded Gabbay

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: default avatarTomer Tayar <ttayar@habana.ai>
Reviewed-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
Signed-off-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
parent d45331b0
...@@ -970,7 +970,8 @@ int hl_device_init(struct hl_device *hdev, struct class *hclass) ...@@ -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 @@ int hl_device_init(struct hl_device *hdev, struct class *hclass) ...@@ -1053,8 +1054,6 @@ int hl_device_init(struct hl_device *hdev, struct class *hclass)
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:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment