Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9cbc7f9 authored by Prakash Gupta's avatar Prakash Gupta Committed by Isaac J. Manjarres
Browse files

iommu: iommu-debug: check valid pfn before performing ATOS ops



ATOS operation can be fatal when performed on invalid pfn. Validate mapped
entry pfn for validity before performing ATOS operation.

Change-Id: Ie1b118d768c396f91618ee1eb101754cbee5318e
Signed-off-by: default avatarPrakash Gupta <guptap@codeaurora.org>
[isaacm@codeaurora: Move PFN validity check prior to IOVA assignment]
Signed-off-by: default avatarIsaac J. Manjarres <isaacm@codeaurora.org>
parent bda68082
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -1562,6 +1562,8 @@ static ssize_t iommu_debug_atos_write(struct file *file,
{
{
	struct iommu_debug_device *ddev = file->private_data;
	struct iommu_debug_device *ddev = file->private_data;
	dma_addr_t iova;
	dma_addr_t iova;
	phys_addr_t phys;
	unsigned long pfn;


	if (kstrtox_from_user(ubuf, count, 0, &iova)) {
	if (kstrtox_from_user(ubuf, count, 0, &iova)) {
		pr_err_ratelimited("Invalid format for iova\n");
		pr_err_ratelimited("Invalid format for iova\n");
@@ -1569,7 +1571,14 @@ static ssize_t iommu_debug_atos_write(struct file *file,
		return -EINVAL;
		return -EINVAL;
	}
	}


	phys = iommu_iova_to_phys(ddev->domain, ddev->iova);
	pfn = __phys_to_pfn(phys);
	if (!pfn_valid(pfn)) {
		dev_err(ddev->dev, "Invalid ATOS operation page %pa\n", &phys);
		return -EINVAL;
	}
	ddev->iova = iova;
	ddev->iova = iova;

	pr_err_ratelimited("Saved iova=%pa for future ATOS commands\n", &iova);
	pr_err_ratelimited("Saved iova=%pa for future ATOS commands\n", &iova);
	return count;
	return count;
}
}