Commit 6a3908ce authored by Johan Hovold's avatar Johan Hovold Committed by Joerg Roedel
Browse files

iommu/qcom: fix device leak on of_xlate()



Make sure to drop the reference taken to the iommu platform device when
looking up its driver data during of_xlate().

Note that commit e2eae099 ("iommu/qcom: add missing put_device()
call in qcom_iommu_of_xlate()") fixed the leak in a couple of error
paths, but the reference is still leaking on success and late failures.

Fixes: 0ae349a0 ("iommu/qcom: Add qcom_iommu")
Cc: stable@vger.kernel.org	# 4.14: e2eae099
Cc: Rob Clark <robin.clark@oss.qualcomm.com>
Cc: Yu Kuai <yukuai3@huawei.com>
Acked-by: default avatarRobin Murphy <robin.murphy@arm.com>
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Signed-off-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
parent a6eaa872
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -566,14 +566,14 @@ static int qcom_iommu_of_xlate(struct device *dev,

	qcom_iommu = platform_get_drvdata(iommu_pdev);

	put_device(&iommu_pdev->dev);

	/* make sure the asid specified in dt is valid, so we don't have
	 * to sanity check this elsewhere:
	 */
	if (WARN_ON(asid > qcom_iommu->max_asid) ||
	    WARN_ON(qcom_iommu->ctxs[asid] == NULL)) {
		put_device(&iommu_pdev->dev);
	    WARN_ON(qcom_iommu->ctxs[asid] == NULL))
		return -EINVAL;
	}

	if (!dev_iommu_priv_get(dev)) {
		dev_iommu_priv_set(dev, qcom_iommu);
@@ -582,11 +582,9 @@ static int qcom_iommu_of_xlate(struct device *dev,
		 * multiple different iommu devices.  Multiple context
		 * banks are ok, but multiple devices are not:
		 */
		if (WARN_ON(qcom_iommu != dev_iommu_priv_get(dev))) {
			put_device(&iommu_pdev->dev);
		if (WARN_ON(qcom_iommu != dev_iommu_priv_get(dev)))
			return -EINVAL;
	}
	}

	return iommu_fwspec_add_ids(dev, &asid, 1);
}