Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drivers/iommu/msm_iommu_dev.c: fix leak and clean up error paths

Fix two obvious problems:

1. We have registered msm_iommu_driver first, and need unregister it
when registered msm_iommu_ctx_driver fail

2. We don't need to kfree drvdata before kzalloc was successful.

[akpm@linux-foundation.org: remove now-unneeded initialization of ctx_drvdata, remove unneeded braces]
Signed-off-by: Libo Chen <libo.chen@huawei.com>
Acked-by: David Brown <davidb@codeaurora.org>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: James Hogan <james.hogan@imgtec.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Libo Chen and committed by
Linus Torvalds
34e3a58c 9756b918

+10 -14
+10 -14
drivers/iommu/msm_iommu_dev.c
··· 291 291 { 292 292 struct msm_iommu_ctx_dev *c = pdev->dev.platform_data; 293 293 struct msm_iommu_drvdata *drvdata; 294 - struct msm_iommu_ctx_drvdata *ctx_drvdata = NULL; 294 + struct msm_iommu_ctx_drvdata *ctx_drvdata; 295 295 int i, ret; 296 - if (!c || !pdev->dev.parent) { 297 - ret = -EINVAL; 298 - goto fail; 299 - } 296 + 297 + if (!c || !pdev->dev.parent) 298 + return -EINVAL; 300 299 301 300 drvdata = dev_get_drvdata(pdev->dev.parent); 302 - 303 - if (!drvdata) { 304 - ret = -ENODEV; 305 - goto fail; 306 - } 301 + if (!drvdata) 302 + return -ENODEV; 307 303 308 304 ctx_drvdata = kzalloc(sizeof(*ctx_drvdata), GFP_KERNEL); 309 - if (!ctx_drvdata) { 310 - ret = -ENOMEM; 311 - goto fail; 312 - } 305 + if (!ctx_drvdata) 306 + return -ENOMEM; 307 + 313 308 ctx_drvdata->num = c->num; 314 309 ctx_drvdata->pdev = pdev; 315 310 ··· 398 403 399 404 ret = platform_driver_register(&msm_iommu_ctx_driver); 400 405 if (ret != 0) { 406 + platform_driver_unregister(&msm_iommu_driver); 401 407 pr_err("Failed to register IOMMU context driver\n"); 402 408 goto error; 403 409 }