From: Laurent Pinchart <laurent.pinchart-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org>
To: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
Cc: will.deacon-5wv7dgnIgG8@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
brian.starkey-5wv7dgnIgG8@public.gmane.org
Subject: Re: [PATCH 1/5] iommu/io-pgtable-arm: Avoid dereferencing bogus PTEs
Date: Sun, 13 Dec 2015 23:41:01 +0200 [thread overview]
Message-ID: <7110327.9BOBJr0LiQ@avalon> (raw)
In-Reply-To: <ad5898fd59575d0e2a8dccabafde71650f44e2a8.1449246988.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
Hi Robin,
Thank you for the patch.
On Friday 04 December 2015 17:52:58 Robin Murphy wrote:
> In the case of corrupted page tables, or when an invalid size is given,
> __arm_lpae_unmap() may recurse beyond the maximum number of levels.
> Unfortunately the detection of this error condition only happens *after*
> calculating a nonsense offset from something which might not be a valid
> table pointer and dereferencing that to see if it is a valid PTE.
>
> Make things a little more robust by checking the level is valid before
> doing anything which depends on it being so.
>
> Signed-off-by: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
This looks good to me.
Reviewed-by: Laurent Pinchart <laurent.pinchart-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org>
I'm curious though, have you seen this error in practice ?
> ---
> drivers/iommu/io-pgtable-arm.c | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c
> index 7df9777..366a354 100644
> --- a/drivers/iommu/io-pgtable-arm.c
> +++ b/drivers/iommu/io-pgtable-arm.c
> @@ -486,11 +486,13 @@ static int __arm_lpae_unmap(struct arm_lpae_io_pgtable
> *data, void *cookie = data->iop.cookie;
> size_t blk_size = ARM_LPAE_BLOCK_SIZE(lvl, data);
>
> + /* Something went horribly wrong and we ran out of page table */
> + if (WARN_ON(lvl == ARM_LPAE_MAX_LEVELS))
> + return 0;
> +
> ptep += ARM_LPAE_LVL_IDX(iova, lvl, data);
> pte = *ptep;
> -
> - /* Something went horribly wrong and we ran out of page table */
> - if (WARN_ON(!pte || (lvl == ARM_LPAE_MAX_LEVELS)))
> + if (WARN_ON(!pte))
> return 0;
>
> /* If the size matches this level, we're in the right place */
--
Regards,
Laurent Pinchart
WARNING: multiple messages have this Message-ID (diff)
From: laurent.pinchart@ideasonboard.com (Laurent Pinchart)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/5] iommu/io-pgtable-arm: Avoid dereferencing bogus PTEs
Date: Sun, 13 Dec 2015 23:41:01 +0200 [thread overview]
Message-ID: <7110327.9BOBJr0LiQ@avalon> (raw)
In-Reply-To: <ad5898fd59575d0e2a8dccabafde71650f44e2a8.1449246988.git.robin.murphy@arm.com>
Hi Robin,
Thank you for the patch.
On Friday 04 December 2015 17:52:58 Robin Murphy wrote:
> In the case of corrupted page tables, or when an invalid size is given,
> __arm_lpae_unmap() may recurse beyond the maximum number of levels.
> Unfortunately the detection of this error condition only happens *after*
> calculating a nonsense offset from something which might not be a valid
> table pointer and dereferencing that to see if it is a valid PTE.
>
> Make things a little more robust by checking the level is valid before
> doing anything which depends on it being so.
>
> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
This looks good to me.
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
I'm curious though, have you seen this error in practice ?
> ---
> drivers/iommu/io-pgtable-arm.c | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c
> index 7df9777..366a354 100644
> --- a/drivers/iommu/io-pgtable-arm.c
> +++ b/drivers/iommu/io-pgtable-arm.c
> @@ -486,11 +486,13 @@ static int __arm_lpae_unmap(struct arm_lpae_io_pgtable
> *data, void *cookie = data->iop.cookie;
> size_t blk_size = ARM_LPAE_BLOCK_SIZE(lvl, data);
>
> + /* Something went horribly wrong and we ran out of page table */
> + if (WARN_ON(lvl == ARM_LPAE_MAX_LEVELS))
> + return 0;
> +
> ptep += ARM_LPAE_LVL_IDX(iova, lvl, data);
> pte = *ptep;
> -
> - /* Something went horribly wrong and we ran out of page table */
> - if (WARN_ON(!pte || (lvl == ARM_LPAE_MAX_LEVELS)))
> + if (WARN_ON(!pte))
> return 0;
>
> /* If the size matches this level, we're in the right place */
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2015-12-13 21:41 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-04 17:52 [PATCH 0/5] io-pgtable fixes + ARM short-descriptor format Robin Murphy
2015-12-04 17:52 ` Robin Murphy
[not found] ` <cover.1449246988.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-12-04 17:52 ` [PATCH 1/5] iommu/io-pgtable-arm: Avoid dereferencing bogus PTEs Robin Murphy
2015-12-04 17:52 ` Robin Murphy
[not found] ` <ad5898fd59575d0e2a8dccabafde71650f44e2a8.1449246988.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-12-13 21:41 ` Laurent Pinchart [this message]
2015-12-13 21:41 ` Laurent Pinchart
2015-12-14 15:33 ` Robin Murphy
2015-12-14 15:33 ` Robin Murphy
2015-12-04 17:52 ` [PATCH 2/5] iommu/io-pgtable: Indicate granule for TLB maintenance Robin Murphy
2015-12-04 17:52 ` Robin Murphy
[not found] ` <67223d4b1ff57f3f46e8c3102e663a063a50a7f7.1449246988.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-12-07 11:08 ` Will Deacon
2015-12-07 11:08 ` Will Deacon
[not found] ` <20151207110804.GA23430-5wv7dgnIgG8@public.gmane.org>
2015-12-07 12:09 ` Robin Murphy
2015-12-07 12:09 ` Robin Murphy
[not found] ` <56657714.50504-5wv7dgnIgG8@public.gmane.org>
2015-12-07 13:48 ` Will Deacon
2015-12-07 13:48 ` Will Deacon
2015-12-07 18:18 ` [PATCH v2] " Robin Murphy
2015-12-07 18:18 ` Robin Murphy
2015-12-04 17:53 ` [PATCH 3/5] iommu/arm-smmu: Invalidate TLBs properly Robin Murphy
2015-12-04 17:53 ` Robin Murphy
[not found] ` <2acaea8656f14a4421d7d466dd242fe5a3d0f6f6.1449246988.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-12-07 11:09 ` Will Deacon
2015-12-07 11:09 ` Will Deacon
[not found] ` <20151207110939.GB23430-5wv7dgnIgG8@public.gmane.org>
2015-12-07 13:09 ` Robin Murphy
2015-12-07 13:09 ` Robin Murphy
[not found] ` <5665850F.1060406-5wv7dgnIgG8@public.gmane.org>
2015-12-07 13:34 ` Will Deacon
2015-12-07 13:34 ` Will Deacon
2015-12-07 18:18 ` [PATCH v2] " Robin Murphy
2015-12-07 18:18 ` Robin Murphy
[not found] ` <ac2d6aedf473cf01eb1df48a1f81614f0f74b0b1.1449501523.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-12-07 18:28 ` Will Deacon
2015-12-07 18:28 ` Will Deacon
2015-12-04 17:53 ` [PATCH 4/5] iommu/io-pgtable: Make io_pgtable_ops_to_pgtable() macro common Robin Murphy
2015-12-04 17:53 ` Robin Murphy
[not found] ` <ef5954ba727840a020b62b0135a1ce9f4a10fb2c.1449246988.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-12-13 21:52 ` Laurent Pinchart
2015-12-13 21:52 ` Laurent Pinchart
2015-12-04 17:53 ` [PATCH 5/5] iommu/io-pgtable: Add ARMv7 short descriptor support Robin Murphy
2015-12-04 17:53 ` Robin Murphy
[not found] ` <3c72de1e8caa28cbfd423de41c6cba812db4e7db.1449246988.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-12-08 8:58 ` Yong Wu
2015-12-08 8:58 ` Yong Wu
2015-12-17 20:12 ` Robin Murphy
2015-12-17 20:12 ` Robin Murphy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7110327.9BOBJr0LiQ@avalon \
--to=laurent.pinchart-rylnwiuwjnjg/c1bvhzhaw@public.gmane.org \
--cc=brian.starkey-5wv7dgnIgG8@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=robin.murphy-5wv7dgnIgG8@public.gmane.org \
--cc=will.deacon-5wv7dgnIgG8@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.