linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/4] kasan: Rename kasan_enabled to kasan_report_enabled
@ 2015-09-03  7:54 Aneesh Kumar K.V
  2015-09-03  7:54 ` [PATCH 2/4] kasan: MODULE_VADDR is not available on all archs Aneesh Kumar K.V
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Aneesh Kumar K.V @ 2015-09-03  7:54 UTC (permalink / raw)
  To: akpm, Andrey Ryabinin; +Cc: linux-mm, linux-kernel, Aneesh Kumar K.V

The function only disable/enable reporting. In the later patch
we will be adding a kasan early enable/disable. Rename kasan_enabled
to properly reflect its function.

Reviewed-by: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 mm/kasan/kasan.h  | 2 +-
 mm/kasan/report.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h
index c242adf6bc85..a6b46cc94907 100644
--- a/mm/kasan/kasan.h
+++ b/mm/kasan/kasan.h
@@ -63,7 +63,7 @@ static inline const void *kasan_shadow_to_mem(const void *shadow_addr)
 		<< KASAN_SHADOW_SCALE_SHIFT);
 }
 
-static inline bool kasan_enabled(void)
+static inline bool kasan_report_enabled(void)
 {
 	return !current->kasan_depth;
 }
diff --git a/mm/kasan/report.c b/mm/kasan/report.c
index e07c94fbd0ac..6c3f82b0240b 100644
--- a/mm/kasan/report.c
+++ b/mm/kasan/report.c
@@ -220,7 +220,7 @@ void kasan_report(unsigned long addr, size_t size,
 {
 	struct kasan_access_info info;
 
-	if (likely(!kasan_enabled()))
+	if (likely(!kasan_report_enabled()))
 		return;
 
 	info.access_addr = (void *)addr;
-- 
2.5.0

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/4] kasan: MODULE_VADDR is not available on all archs
  2015-09-03  7:54 [PATCH 1/4] kasan: Rename kasan_enabled to kasan_report_enabled Aneesh Kumar K.V
@ 2015-09-03  7:54 ` Aneesh Kumar K.V
  2015-09-03  8:25   ` Andrey Ryabinin
  2015-09-03  7:54 ` [PATCH 3/4] kasan: Don't use kasan shadow pointer in generic functions Aneesh Kumar K.V
  2015-09-03  7:54 ` [PATCH 4/4] kasan: Prevent deadlock in kasan reporting Aneesh Kumar K.V
  2 siblings, 1 reply; 7+ messages in thread
From: Aneesh Kumar K.V @ 2015-09-03  7:54 UTC (permalink / raw)
  To: akpm, Andrey Ryabinin; +Cc: linux-mm, linux-kernel, Aneesh Kumar K.V

Use is_module_text_address instead

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 mm/kasan/report.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/mm/kasan/report.c b/mm/kasan/report.c
index 6c3f82b0240b..01d2efec8ea4 100644
--- a/mm/kasan/report.c
+++ b/mm/kasan/report.c
@@ -22,6 +22,7 @@
 #include <linux/string.h>
 #include <linux/types.h>
 #include <linux/kasan.h>
+#include <linux/module.h>
 
 #include <asm/sections.h>
 
@@ -85,9 +86,11 @@ static void print_error_description(struct kasan_access_info *info)
 
 static inline bool kernel_or_module_addr(const void *addr)
 {
-	return (addr >= (void *)_stext && addr < (void *)_end)
-		|| (addr >= (void *)MODULES_VADDR
-			&& addr < (void *)MODULES_END);
+	if (addr >= (void *)_stext && addr < (void *)_end)
+		return true;
+	if (is_module_text_address((unsigned long)addr))
+		return true;
+	return false;
 }
 
 static inline bool init_task_stack_addr(const void *addr)
-- 
2.5.0

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/4] kasan: Don't use kasan shadow pointer in generic functions
  2015-09-03  7:54 [PATCH 1/4] kasan: Rename kasan_enabled to kasan_report_enabled Aneesh Kumar K.V
  2015-09-03  7:54 ` [PATCH 2/4] kasan: MODULE_VADDR is not available on all archs Aneesh Kumar K.V
@ 2015-09-03  7:54 ` Aneesh Kumar K.V
  2015-09-03  8:47   ` Andrey Ryabinin
  2015-09-03  7:54 ` [PATCH 4/4] kasan: Prevent deadlock in kasan reporting Aneesh Kumar K.V
  2 siblings, 1 reply; 7+ messages in thread
From: Aneesh Kumar K.V @ 2015-09-03  7:54 UTC (permalink / raw)
  To: akpm, Andrey Ryabinin; +Cc: linux-mm, linux-kernel, Aneesh Kumar K.V

We can't use generic functions like print_hex_dump to access kasan
shadow region. This require us to setup another kasan shadow region
for the address passed (kasan shadow address). Most architecture won't
be able to do that. Hence make a copy of the shadow region row and
pass that to generic functions.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 mm/kasan/report.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/mm/kasan/report.c b/mm/kasan/report.c
index 01d2efec8ea4..440bda3a3ecd 100644
--- a/mm/kasan/report.c
+++ b/mm/kasan/report.c
@@ -164,14 +164,20 @@ static void print_shadow_for_address(const void *addr)
 	for (i = -SHADOW_ROWS_AROUND_ADDR; i <= SHADOW_ROWS_AROUND_ADDR; i++) {
 		const void *kaddr = kasan_shadow_to_mem(shadow_row);
 		char buffer[4 + (BITS_PER_LONG/8)*2];
+		char shadow_buf[SHADOW_BYTES_PER_ROW];
 
 		snprintf(buffer, sizeof(buffer),
 			(i == 0) ? ">%p: " : " %p: ", kaddr);
-
+		/*
+		 * We should not pass a shadow pointer to generic
+		 * function, because generic functions may try to
+		 * access kasan mapping for the passed address.
+		 */
 		kasan_disable_current();
+		memcpy(shadow_buf, shadow_row, SHADOW_BYTES_PER_ROW);
 		print_hex_dump(KERN_ERR, buffer,
 			DUMP_PREFIX_NONE, SHADOW_BYTES_PER_ROW, 1,
-			shadow_row, SHADOW_BYTES_PER_ROW, 0);
+			shadow_buf, SHADOW_BYTES_PER_ROW, 0);
 		kasan_enable_current();
 
 		if (row_is_guilty(shadow_row, shadow))
-- 
2.5.0

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 4/4] kasan: Prevent deadlock in kasan reporting
  2015-09-03  7:54 [PATCH 1/4] kasan: Rename kasan_enabled to kasan_report_enabled Aneesh Kumar K.V
  2015-09-03  7:54 ` [PATCH 2/4] kasan: MODULE_VADDR is not available on all archs Aneesh Kumar K.V
  2015-09-03  7:54 ` [PATCH 3/4] kasan: Don't use kasan shadow pointer in generic functions Aneesh Kumar K.V
@ 2015-09-03  7:54 ` Aneesh Kumar K.V
  2015-09-03  9:15   ` Andrey Ryabinin
  2 siblings, 1 reply; 7+ messages in thread
From: Aneesh Kumar K.V @ 2015-09-03  7:54 UTC (permalink / raw)
  To: akpm, Andrey Ryabinin; +Cc: linux-mm, linux-kernel, Aneesh Kumar K.V

We we end up calling kasan_report in real mode, our shadow mapping
for even spinlock variable will show poisoned. This will result
in us calling kasan_report_error with lock_report spin lock held.
To prevent this disable kasan reporting when we are priting
error w.r.t kasan.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 mm/kasan/report.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/mm/kasan/report.c b/mm/kasan/report.c
index 440bda3a3ecd..8c409b1664c8 100644
--- a/mm/kasan/report.c
+++ b/mm/kasan/report.c
@@ -173,12 +173,10 @@ static void print_shadow_for_address(const void *addr)
 		 * function, because generic functions may try to
 		 * access kasan mapping for the passed address.
 		 */
-		kasan_disable_current();
 		memcpy(shadow_buf, shadow_row, SHADOW_BYTES_PER_ROW);
 		print_hex_dump(KERN_ERR, buffer,
 			DUMP_PREFIX_NONE, SHADOW_BYTES_PER_ROW, 1,
 			shadow_buf, SHADOW_BYTES_PER_ROW, 0);
-		kasan_enable_current();
 
 		if (row_is_guilty(shadow_row, shadow))
 			pr_err("%*c\n",
@@ -195,6 +193,10 @@ void kasan_report_error(struct kasan_access_info *info)
 {
 	unsigned long flags;
 
+	/*
+	 * Make sure we don't end up in loop.
+	 */
+	kasan_disable_current();
 	spin_lock_irqsave(&report_lock, flags);
 	pr_err("================================="
 		"=================================\n");
@@ -204,12 +206,17 @@ void kasan_report_error(struct kasan_access_info *info)
 	pr_err("================================="
 		"=================================\n");
 	spin_unlock_irqrestore(&report_lock, flags);
+	kasan_enable_current();
 }
 
 void kasan_report_user_access(struct kasan_access_info *info)
 {
 	unsigned long flags;
 
+	/*
+	 * Make sure we don't end up in loop.
+	 */
+	kasan_disable_current();
 	spin_lock_irqsave(&report_lock, flags);
 	pr_err("================================="
 		"=================================\n");
@@ -222,6 +229,7 @@ void kasan_report_user_access(struct kasan_access_info *info)
 	pr_err("================================="
 		"=================================\n");
 	spin_unlock_irqrestore(&report_lock, flags);
+	kasan_enable_current();
 }
 
 void kasan_report(unsigned long addr, size_t size,
-- 
2.5.0

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/4] kasan: MODULE_VADDR is not available on all archs
  2015-09-03  7:54 ` [PATCH 2/4] kasan: MODULE_VADDR is not available on all archs Aneesh Kumar K.V
@ 2015-09-03  8:25   ` Andrey Ryabinin
  0 siblings, 0 replies; 7+ messages in thread
From: Andrey Ryabinin @ 2015-09-03  8:25 UTC (permalink / raw)
  To: Aneesh Kumar K.V; +Cc: akpm, linux-mm, linux-kernel



On 09/03/2015 10:54 AM, Aneesh Kumar K.V wrote:
> Use is_module_text_address instead
> 

It should be is_module_address().

We use kernel_or_module_addr() to determine whether this
address belongs to some global variable or not.
And variables are in .data section, .text is only code.

Something like is_module_data_address() would be more precise here.
But since we don't have it, we can just use is_module_address().
Definitely not is_module_text_address().

> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> ---
>  mm/kasan/report.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/mm/kasan/report.c b/mm/kasan/report.c
> index 6c3f82b0240b..01d2efec8ea4 100644
> --- a/mm/kasan/report.c
> +++ b/mm/kasan/report.c
> @@ -22,6 +22,7 @@
>  #include <linux/string.h>
>  #include <linux/types.h>
>  #include <linux/kasan.h>
> +#include <linux/module.h>
>  
>  #include <asm/sections.h>
>  
> @@ -85,9 +86,11 @@ static void print_error_description(struct kasan_access_info *info)
>  
>  static inline bool kernel_or_module_addr(const void *addr)
>  {
> -	return (addr >= (void *)_stext && addr < (void *)_end)
> -		|| (addr >= (void *)MODULES_VADDR
> -			&& addr < (void *)MODULES_END);
> +	if (addr >= (void *)_stext && addr < (void *)_end)
> +		return true;
> +	if (is_module_text_address((unsigned long)addr))
> +		return true;
> +	return false;
>  }
>  
>  static inline bool init_task_stack_addr(const void *addr)
> 

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 3/4] kasan: Don't use kasan shadow pointer in generic functions
  2015-09-03  7:54 ` [PATCH 3/4] kasan: Don't use kasan shadow pointer in generic functions Aneesh Kumar K.V
@ 2015-09-03  8:47   ` Andrey Ryabinin
  0 siblings, 0 replies; 7+ messages in thread
From: Andrey Ryabinin @ 2015-09-03  8:47 UTC (permalink / raw)
  To: Aneesh Kumar K.V, akpm; +Cc: linux-mm, linux-kernel

On 09/03/2015 10:54 AM, Aneesh Kumar K.V wrote:
> We can't use generic functions like print_hex_dump to access kasan
> shadow region. This require us to setup another kasan shadow region
> for the address passed (kasan shadow address). Most architecture won't
> be able to do that.

s/Most architecture/Some architectures

At least ARM/ARM64/x86 are able to do that.


> Hence make a copy of the shadow region row and
> pass that to generic functions.
> 
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> ---
>  mm/kasan/report.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)

Anyway, for this patch:
	Reviewed-by: Andrey Ryabinin <ryabinin.a.a@gmail.com>

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 4/4] kasan: Prevent deadlock in kasan reporting
  2015-09-03  7:54 ` [PATCH 4/4] kasan: Prevent deadlock in kasan reporting Aneesh Kumar K.V
@ 2015-09-03  9:15   ` Andrey Ryabinin
  0 siblings, 0 replies; 7+ messages in thread
From: Andrey Ryabinin @ 2015-09-03  9:15 UTC (permalink / raw)
  To: Aneesh Kumar K.V, akpm; +Cc: linux-mm, linux-kernel

On 09/03/2015 10:54 AM, Aneesh Kumar K.V wrote:
> We we end up calling kasan_report in real mode, our shadow mapping

s/We we/We

> for even spinlock variable will show poisoned. This will result
> in us calling kasan_report_error with lock_report spin lock held.
> To prevent this disable kasan reporting when we are priting

s/priting/printing 

> error w.r.t kasan.
> 
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> ---
>  mm/kasan/report.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 

Reviewed-by: Andrey Ryabinin <ryabinin.a.a@gmail.com>

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-09-03  9:15 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-03  7:54 [PATCH 1/4] kasan: Rename kasan_enabled to kasan_report_enabled Aneesh Kumar K.V
2015-09-03  7:54 ` [PATCH 2/4] kasan: MODULE_VADDR is not available on all archs Aneesh Kumar K.V
2015-09-03  8:25   ` Andrey Ryabinin
2015-09-03  7:54 ` [PATCH 3/4] kasan: Don't use kasan shadow pointer in generic functions Aneesh Kumar K.V
2015-09-03  8:47   ` Andrey Ryabinin
2015-09-03  7:54 ` [PATCH 4/4] kasan: Prevent deadlock in kasan reporting Aneesh Kumar K.V
2015-09-03  9:15   ` Andrey Ryabinin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).