2017-04-04 21:09:19

by Laura Abbott

[permalink] [raw]
Subject: [PATCH] mm/usercopy: Drop extra is_vmalloc_or_module check

virt_addr_valid was previously insufficient to validate if virt_to_page
could be called on an address on arm64. This has since been fixed up
so there is no need for the extra check. Drop it.

Signed-off-by: Laura Abbott <[email protected]>
---
I've given this some testing on my machine and haven't seen any problems
(e.g. random crashes without the check) and the fix has been in for long
enough now. I'm in no rush to have this merged so I'm okay if this sits in
a tree somewhere to get more testing.
---
mm/usercopy.c | 11 -----------
1 file changed, 11 deletions(-)

diff --git a/mm/usercopy.c b/mm/usercopy.c
index d155e12563b1..4d23a0e0e232 100644
--- a/mm/usercopy.c
+++ b/mm/usercopy.c
@@ -206,17 +206,6 @@ static inline const char *check_heap_object(const void *ptr, unsigned long n,
{
struct page *page;

- /*
- * Some architectures (arm64) return true for virt_addr_valid() on
- * vmalloced addresses. Work around this by checking for vmalloc
- * first.
- *
- * We also need to check for module addresses explicitly since we
- * may copy static data from modules to userspace
- */
- if (is_vmalloc_or_module_addr(ptr))
- return NULL;
-
if (!virt_addr_valid(ptr))
return NULL;

--
2.12.1


2017-04-04 21:10:06

by Kees Cook

[permalink] [raw]
Subject: Re: [PATCH] mm/usercopy: Drop extra is_vmalloc_or_module check

On Tue, Apr 4, 2017 at 2:09 PM, Laura Abbott <[email protected]> wrote:
> virt_addr_valid was previously insufficient to validate if virt_to_page
> could be called on an address on arm64. This has since been fixed up
> so there is no need for the extra check. Drop it.
>
> Signed-off-by: Laura Abbott <[email protected]>
> ---
> I've given this some testing on my machine and haven't seen any problems
> (e.g. random crashes without the check) and the fix has been in for long
> enough now. I'm in no rush to have this merged so I'm okay if this sits in
> a tree somewhere to get more testing.

Awesome, thanks! I'll get it into my usercopy branch for -next.

-Kees

> ---
> mm/usercopy.c | 11 -----------
> 1 file changed, 11 deletions(-)
>
> diff --git a/mm/usercopy.c b/mm/usercopy.c
> index d155e12563b1..4d23a0e0e232 100644
> --- a/mm/usercopy.c
> +++ b/mm/usercopy.c
> @@ -206,17 +206,6 @@ static inline const char *check_heap_object(const void *ptr, unsigned long n,
> {
> struct page *page;
>
> - /*
> - * Some architectures (arm64) return true for virt_addr_valid() on
> - * vmalloced addresses. Work around this by checking for vmalloc
> - * first.
> - *
> - * We also need to check for module addresses explicitly since we
> - * may copy static data from modules to userspace
> - */
> - if (is_vmalloc_or_module_addr(ptr))
> - return NULL;
> -
> if (!virt_addr_valid(ptr))
> return NULL;
>
> --
> 2.12.1
>



--
Kees Cook
Pixel Security

2017-04-05 13:19:27

by Mark Rutland

[permalink] [raw]
Subject: Re: [PATCH] mm/usercopy: Drop extra is_vmalloc_or_module check

On Tue, Apr 04, 2017 at 02:09:00PM -0700, Laura Abbott wrote:
> virt_addr_valid was previously insufficient to validate if virt_to_page
> could be called on an address on arm64. This has since been fixed up
> so there is no need for the extra check. Drop it.
>
> Signed-off-by: Laura Abbott <[email protected]>
> ---
> I've given this some testing on my machine and haven't seen any problems
> (e.g. random crashes without the check) and the fix has been in for long
> enough now. I'm in no rush to have this merged so I'm okay if this sits in
> a tree somewhere to get more testing.

This looks good to me, given your fix for virt_add_valid() in mainline.
FWIW:

Acked-by: Mark Rutland <[email protected]>

Mark.

> ---
> mm/usercopy.c | 11 -----------
> 1 file changed, 11 deletions(-)
>
> diff --git a/mm/usercopy.c b/mm/usercopy.c
> index d155e12563b1..4d23a0e0e232 100644
> --- a/mm/usercopy.c
> +++ b/mm/usercopy.c
> @@ -206,17 +206,6 @@ static inline const char *check_heap_object(const void *ptr, unsigned long n,
> {
> struct page *page;
>
> - /*
> - * Some architectures (arm64) return true for virt_addr_valid() on
> - * vmalloced addresses. Work around this by checking for vmalloc
> - * first.
> - *
> - * We also need to check for module addresses explicitly since we
> - * may copy static data from modules to userspace
> - */
> - if (is_vmalloc_or_module_addr(ptr))
> - return NULL;
> -
> if (!virt_addr_valid(ptr))
> return NULL;
>
> --
> 2.12.1
>