Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1218083 > unrolled thread

[PATCH 1/4] kasan: Rename kasan_enabled to kasan_report_enabled

Started by"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
First post2015-09-03 10:00 +0200
Last post2015-09-03 10:50 +0200
Articles 7 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH 1/4] kasan: Rename kasan_enabled to kasan_report_enabled "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> - 2015-09-03 10:00 +0200
    [PATCH 2/4] kasan: MODULE_VADDR is not available on all archs "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> - 2015-09-03 10:00 +0200
      Re: [PATCH 2/4] kasan: MODULE_VADDR is not available on all archs Andrey Ryabinin <ryabinin.a.a@gmail.com> - 2015-09-03 10:30 +0200
    [PATCH 4/4] kasan: Prevent deadlock in kasan reporting "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> - 2015-09-03 10:00 +0200
      Re: [PATCH 4/4] kasan: Prevent deadlock in kasan reporting Andrey Ryabinin <ryabinin.a.a@gmail.com> - 2015-09-03 11:20 +0200
    [PATCH 3/4] kasan: Don't use kasan shadow pointer in generic functions "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> - 2015-09-03 10:00 +0200
      Re: [PATCH 3/4] kasan: Don't use kasan shadow pointer in generic  functions Andrey Ryabinin <ryabinin.a.a@gmail.com> - 2015-09-03 10:50 +0200

#1218083 — [PATCH 1/4] kasan: Rename kasan_enabled to kasan_report_enabled

From"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Date2015-09-03 10:00 +0200
Subject[PATCH 1/4] kasan: Rename kasan_enabled to kasan_report_enabled
Message-ID<q4xB8-5Ju-7@gated-at.bofh.it>
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 from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [next] | [standalone]


#1218084 — [PATCH 2/4] kasan: MODULE_VADDR is not available on all archs

From"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Date2015-09-03 10:00 +0200
Subject[PATCH 2/4] kasan: MODULE_VADDR is not available on all archs
Message-ID<q4xB8-5Ju-9@gated-at.bofh.it>
In reply to#1218083
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 from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1218096 — Re: [PATCH 2/4] kasan: MODULE_VADDR is not available on all archs

FromAndrey Ryabinin <ryabinin.a.a@gmail.com>
Date2015-09-03 10:30 +0200
SubjectRe: [PATCH 2/4] kasan: MODULE_VADDR is not available on all archs
Message-ID<q4y4a-6wl-1@gated-at.bofh.it>
In reply to#1218084

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 from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1218085 — [PATCH 4/4] kasan: Prevent deadlock in kasan reporting

From"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Date2015-09-03 10:00 +0200
Subject[PATCH 4/4] kasan: Prevent deadlock in kasan reporting
Message-ID<q4xB8-5Ju-5@gated-at.bofh.it>
In reply to#1218083
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 from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1218117 — Re: [PATCH 4/4] kasan: Prevent deadlock in kasan reporting

FromAndrey Ryabinin <ryabinin.a.a@gmail.com>
Date2015-09-03 11:20 +0200
SubjectRe: [PATCH 4/4] kasan: Prevent deadlock in kasan reporting
Message-ID<q4yQy-7Gl-27@gated-at.bofh.it>
In reply to#1218085
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 from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1218088 — [PATCH 3/4] kasan: Don't use kasan shadow pointer in generic functions

From"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Date2015-09-03 10:00 +0200
Subject[PATCH 3/4] kasan: Don't use kasan shadow pointer in generic functions
Message-ID<q4xB8-5Ju-17@gated-at.bofh.it>
In reply to#1218083
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 from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [next] | [standalone]


#1218104 — Re: [PATCH 3/4] kasan: Don't use kasan shadow pointer in generic functions

FromAndrey Ryabinin <ryabinin.a.a@gmail.com>
Date2015-09-03 10:50 +0200
SubjectRe: [PATCH 3/4] kasan: Don't use kasan shadow pointer in generic functions
Message-ID<q4ynw-6T4-9@gated-at.bofh.it>
In reply to#1218088
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 from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web