linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH] lib/strscpy: avoid KASAN false positive
  2017-07-18 17:15 [PATCH] lib/strscpy: avoid KASAN false positive Andrey Ryabinin
@ 2017-07-18 17:14 ` Dmitry Vyukov
  2017-07-18 17:22 ` Linus Torvalds
  1 sibling, 0 replies; 13+ messages in thread
From: Dmitry Vyukov @ 2017-07-18 17:14 UTC (permalink / raw)
  To: Andrey Ryabinin
  Cc: Andrew Morton, Dave Jones, Linus Torvalds, Alexander Potapenko,
	kasan-dev, LKML

On Tue, Jul 18, 2017 at 7:15 PM, Andrey Ryabinin
<aryabinin@virtuozzo.com> wrote:
> strscpy() performs the word-at-a-time optimistic reads. So it may
> may access the memory past the end of the object, which is perfectly fine
> since strscpy() doesn't use that (past-the-end) data and makes sure the
> optimistic read won't cross a page boundary.
>
> But KASAN doesn't know anything about that so it will complain.
> Let's just fallback to the byte-at-a-time reads under CONFIG_KASAN=y
> to avoid false-positives.

Acked-by: Dmitry Vyukov <dvyukov@google.com>

> Reported-by: Dave Jones <davej@codemonkey.org.uk>
> Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
> ---
>  lib/string.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/lib/string.c b/lib/string.c
> index ebbb99c775bd..8b93d2519d5a 100644
> --- a/lib/string.c
> +++ b/lib/string.c
> @@ -199,6 +199,13 @@ ssize_t strscpy(char *dest, const char *src, size_t count)
>                 max = 0;
>  #endif
>
> +       /*
> +        * KASAN won't be happy about word-at-a-time
> +        * optimistic reads, so let's avoid them.
> +        */
> +       if (IS_ENABLED(CONFIG_KASAN))
> +               max = 0;
> +
>         while (max >= sizeof(unsigned long)) {
>                 unsigned long c, data;
>
> --
> 2.13.0
>

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

* [PATCH] lib/strscpy: avoid KASAN false positive
@ 2017-07-18 17:15 Andrey Ryabinin
  2017-07-18 17:14 ` Dmitry Vyukov
  2017-07-18 17:22 ` Linus Torvalds
  0 siblings, 2 replies; 13+ messages in thread
From: Andrey Ryabinin @ 2017-07-18 17:15 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Dave Jones, Linus Torvalds, Alexander Potapenko, Dmitry Vyukov,
	kasan-dev, linux-kernel, Andrey Ryabinin

strscpy() performs the word-at-a-time optimistic reads. So it may
may access the memory past the end of the object, which is perfectly fine
since strscpy() doesn't use that (past-the-end) data and makes sure the
optimistic read won't cross a page boundary.

But KASAN doesn't know anything about that so it will complain.
Let's just fallback to the byte-at-a-time reads under CONFIG_KASAN=y
to avoid false-positives.

Reported-by: Dave Jones <davej@codemonkey.org.uk>
Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
---
 lib/string.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/lib/string.c b/lib/string.c
index ebbb99c775bd..8b93d2519d5a 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -199,6 +199,13 @@ ssize_t strscpy(char *dest, const char *src, size_t count)
 		max = 0;
 #endif
 
+	/*
+	 * KASAN won't be happy about word-at-a-time
+	 * optimistic reads, so let's avoid them.
+	 */
+	if (IS_ENABLED(CONFIG_KASAN))
+		max = 0;
+
 	while (max >= sizeof(unsigned long)) {
 		unsigned long c, data;
 
-- 
2.13.0

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

* Re: [PATCH] lib/strscpy: avoid KASAN false positive
  2017-07-18 17:15 [PATCH] lib/strscpy: avoid KASAN false positive Andrey Ryabinin
  2017-07-18 17:14 ` Dmitry Vyukov
@ 2017-07-18 17:22 ` Linus Torvalds
  2017-07-18 20:15   ` Andrey Ryabinin
  1 sibling, 1 reply; 13+ messages in thread
From: Linus Torvalds @ 2017-07-18 17:22 UTC (permalink / raw)
  To: Andrey Ryabinin
  Cc: Andrew Morton, Dave Jones, Alexander Potapenko, Dmitry Vyukov,
	kasan-dev, Linux Kernel Mailing List

On Tue, Jul 18, 2017 at 10:15 AM, Andrey Ryabinin
<aryabinin@virtuozzo.com> wrote:
>
> +       /*
> +        * KASAN won't be happy about word-at-a-time
> +        * optimistic reads, so let's avoid them.
> +        */
> +       if (IS_ENABLED(CONFIG_KASAN))
> +               max = 0;
> +

No, please don't.

Two reasons:

 (a) it turns out that KASAN doesn't actually warn about this when
there aren't buggy users (because we only do word-at-a-time in the
spacified-to-be-safe region anyway).

 (b) havign automated testing that then just changes semantics and
implementation of what is tested is a bad bad bad idea.

So (a) says that we shouldn't need it in the first place, and (b) says
that we should avoid KASAN changing behavior unless we absolutely
*have* to.

In fact, I think we should *never* have that kind of "KASAN changes
semantics". If there is some particular load that is known to be
problematic for KASAN, we *still* shouldn't change semantics, we
should just mark that single load as being unchecked by KASAN.

                  Linus

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

* Re: [PATCH] lib/strscpy: avoid KASAN false positive
  2017-07-18 17:22 ` Linus Torvalds
@ 2017-07-18 20:15   ` Andrey Ryabinin
  2017-07-18 20:26     ` Linus Torvalds
  0 siblings, 1 reply; 13+ messages in thread
From: Andrey Ryabinin @ 2017-07-18 20:15 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Andrew Morton, Dave Jones, Alexander Potapenko, Dmitry Vyukov,
	kasan-dev, Linux Kernel Mailing List

On 07/18/2017 08:22 PM, Linus Torvalds wrote:
> On Tue, Jul 18, 2017 at 10:15 AM, Andrey Ryabinin
> <aryabinin@virtuozzo.com> wrote:
>>
>> +       /*
>> +        * KASAN won't be happy about word-at-a-time
>> +        * optimistic reads, so let's avoid them.
>> +        */
>> +       if (IS_ENABLED(CONFIG_KASAN))
>> +               max = 0;
>> +
> 
> No, please don't.
> 
> Two reasons:
> 
>  (a) it turns out that KASAN doesn't actually warn about this when
> there aren't buggy users (because we only do word-at-a-time in the
> spacified-to-be-safe region anyway).
> 

No, it does warn about valid users. The report that Dave posted wasn't about wrong strscpy() usage
it was about reading 8-bytes from 5-bytes source string. It wasn't about buggy 'count' at all.
So KASAN will warn for perfectly valid code like this:
	char dest[16];
	strscpy(dest, "12345", sizeof(dest)):

Currently KASAN doesn't complain about strscpy() only because KASAN doesn't complain about unused code.
And after 077d2ba519b2e8bf1ab("replace incorrect strscpy use in FORTIFY_SOURCE") or before the
FORTIFY_SOURCE patch strscpy() is pretty much unused. Only 2 calls in some drivers, plus 3 in tile arch-code.



>  (b) havign automated testing that then just changes semantics and
> implementation of what is tested is a bad bad bad idea.
> 

I agree, but what choice do we have here?

> So (a) says that we shouldn't need it in the first place, and (b) says
> that we should avoid KASAN changing behavior unless we absolutely
> *have* to.
> 

(a) is wrong. I absolutely agree with (b) and I think that this is exactly
the case where we have to do this.

> In fact, I think we should *never* have that kind of "KASAN changes
> semantics". If there is some particular load that is known to be
> problematic for KASAN, we *still* shouldn't change semantics, we
> should just mark that single load as being unchecked by KASAN.

For strscpy() that would mean making the *whole* read from 'src' buffer unchecked by KASAN.

Although, we can always check the 'src' afterwards. But honestly, this looks shitty:

---
 lib/string.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/lib/string.c b/lib/string.c
index ebbb99c775bd..5624b629bffa 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -23,6 +23,7 @@
 #include <linux/string.h>
 #include <linux/ctype.h>
 #include <linux/kernel.h>
+#include <linux/kasan-checks.h>
 #include <linux/export.h>
 #include <linux/bug.h>
 #include <linux/errno.h>
@@ -202,12 +203,15 @@ ssize_t strscpy(char *dest, const char *src, size_t count)
 	while (max >= sizeof(unsigned long)) {
 		unsigned long c, data;
 
-		c = *(unsigned long *)(src+res);
+		c = READ_ONCE_NOCHECK(*(unsigned long *)(src+res));
 		if (has_zero(c, &data, &constants)) {
 			data = prep_zero_mask(c, data, &constants);
 			data = create_zero_mask(data);
 			*(unsigned long *)(dest+res) = c & zero_bytemask(data);
-			return res + find_zero(data);
+
+			res = res + find_zero(data);
+			kasan_check_read(src, res);
+			return res;
 		}
 		*(unsigned long *)(dest+res) = c;
 		res += sizeof(unsigned long);
@@ -215,6 +219,7 @@ ssize_t strscpy(char *dest, const char *src, size_t count)
 		max -= sizeof(unsigned long);
 	}
 
+	kasan_check_read(src, res);
 	while (count) {
 		char c;
 
-- 
2.13.0

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

* Re: [PATCH] lib/strscpy: avoid KASAN false positive
  2017-07-18 20:15   ` Andrey Ryabinin
@ 2017-07-18 20:26     ` Linus Torvalds
  2017-07-18 21:31       ` Andrey Ryabinin
  0 siblings, 1 reply; 13+ messages in thread
From: Linus Torvalds @ 2017-07-18 20:26 UTC (permalink / raw)
  To: Andrey Ryabinin
  Cc: Andrew Morton, Dave Jones, Alexander Potapenko, Dmitry Vyukov,
	kasan-dev, Linux Kernel Mailing List

On Tue, Jul 18, 2017 at 1:15 PM, Andrey Ryabinin
<aryabinin@virtuozzo.com> wrote:
>
> No, it does warn about valid users. The report that Dave posted wasn't about wrong strscpy() usage
> it was about reading 8-bytes from 5-bytes source string. It wasn't about buggy 'count' at all.
> So KASAN will warn for perfectly valid code like this:
>         char dest[16];
>         strscpy(dest, "12345", sizeof(dest)):

Ugh, ok, yes.

> For strscpy() that would mean making the *whole* read from 'src' buffer unchecked by KASAN.

So we do have that READ_ONCE_NOCHECK(), but could we perhaps have
something that doesn't do a NOCHECK but a partial check and is simply
ok with "this is an optimistc longer access"

We have that for the dcache case too, although there the code does
that odd kasan_unpoison_shadow() instead.

                 Linus

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

* Re: [PATCH] lib/strscpy: avoid KASAN false positive
  2017-07-18 20:26     ` Linus Torvalds
@ 2017-07-18 21:31       ` Andrey Ryabinin
  2017-07-18 21:32         ` Andrey Ryabinin
  2017-07-18 22:04         ` Andrew Morton
  0 siblings, 2 replies; 13+ messages in thread
From: Andrey Ryabinin @ 2017-07-18 21:31 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Andrew Morton, Dave Jones, Alexander Potapenko, Dmitry Vyukov,
	kasan-dev, Linux Kernel Mailing List

On 07/18/2017 11:26 PM, Linus Torvalds wrote:
> On Tue, Jul 18, 2017 at 1:15 PM, Andrey Ryabinin
> <aryabinin@virtuozzo.com> wrote:
>>
>> No, it does warn about valid users. The report that Dave posted wasn't about wrong strscpy() usage
>> it was about reading 8-bytes from 5-bytes source string. It wasn't about buggy 'count' at all.
>> So KASAN will warn for perfectly valid code like this:
>>         char dest[16];
>>         strscpy(dest, "12345", sizeof(dest)):
> 
> Ugh, ok, yes.
> 
>> For strscpy() that would mean making the *whole* read from 'src' buffer unchecked by KASAN.
> 
> So we do have that READ_ONCE_NOCHECK(), but could we perhaps have
> something that doesn't do a NOCHECK but a partial check and is simply
> ok with "this is an optimistc longer access"
> 

This can be dont, I think.

Something like this:
static inline unsigned long read_partial_nocheck(unsigned long *x)
{
	unsigned long ret = READ_ONCE_NOCHECK(x);
	kasan_check_partial(x, sizeof(unsigned long));
	return ret;
}

Where kasan_check_partial() will warn only if the kasan shadow has a negative value.
Positive values 1-7 in the shadow would mean a partial oob access, that should be ignored.


> We have that for the dcache case too, although there the code does
> that odd kasan_unpoison_shadow() instead.
>

Yes, it marks memory as valid, so it can be accessed without warning.
We can do this the same in strscpy(), but the disadvantage of this approach is that
memory becomes accessible for everyone, not just for the code that does optimistic reads.
Thus it would be possible to miss some off-by-ones (quite usual bug for strings).

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

* Re: [PATCH] lib/strscpy: avoid KASAN false positive
  2017-07-18 21:31       ` Andrey Ryabinin
@ 2017-07-18 21:32         ` Andrey Ryabinin
  2017-07-18 22:04         ` Andrew Morton
  1 sibling, 0 replies; 13+ messages in thread
From: Andrey Ryabinin @ 2017-07-18 21:32 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Andrew Morton, Dave Jones, Alexander Potapenko, Dmitry Vyukov,
	kasan-dev, Linux Kernel Mailing List



On 07/19/2017 12:31 AM, Andrey Ryabinin wrote:
> On 07/18/2017 11:26 PM, Linus Torvalds wrote:
>> On Tue, Jul 18, 2017 at 1:15 PM, Andrey Ryabinin
>> <aryabinin@virtuozzo.com> wrote:
>>>
>>> No, it does warn about valid users. The report that Dave posted wasn't about wrong strscpy() usage
>>> it was about reading 8-bytes from 5-bytes source string. It wasn't about buggy 'count' at all.
>>> So KASAN will warn for perfectly valid code like this:
>>>         char dest[16];
>>>         strscpy(dest, "12345", sizeof(dest)):
>>
>> Ugh, ok, yes.
>>
>>> For strscpy() that would mean making the *whole* read from 'src' buffer unchecked by KASAN.
>>
>> So we do have that READ_ONCE_NOCHECK(), but could we perhaps have
>> something that doesn't do a NOCHECK but a partial check and is simply
>> ok with "this is an optimistc longer access"
>>
> 
> This can be dont, I think.
s/dont/done

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

* Re: [PATCH] lib/strscpy: avoid KASAN false positive
  2017-07-18 21:31       ` Andrey Ryabinin
  2017-07-18 21:32         ` Andrey Ryabinin
@ 2017-07-18 22:04         ` Andrew Morton
  2017-07-18 22:35           ` Linus Torvalds
  2017-07-19 15:39           ` Chris Metcalf
  1 sibling, 2 replies; 13+ messages in thread
From: Andrew Morton @ 2017-07-18 22:04 UTC (permalink / raw)
  To: Andrey Ryabinin
  Cc: Linus Torvalds, Dave Jones, Alexander Potapenko, Dmitry Vyukov,
	kasan-dev, Linux Kernel Mailing List, Chris Metcalf

On Wed, 19 Jul 2017 00:31:36 +0300 Andrey Ryabinin <aryabinin@virtuozzo.com> wrote:

> On 07/18/2017 11:26 PM, Linus Torvalds wrote:
> > On Tue, Jul 18, 2017 at 1:15 PM, Andrey Ryabinin
> > <aryabinin@virtuozzo.com> wrote:
> >>
> >> No, it does warn about valid users. The report that Dave posted wasn't about wrong strscpy() usage
> >> it was about reading 8-bytes from 5-bytes source string. It wasn't about buggy 'count' at all.
> >> So KASAN will warn for perfectly valid code like this:
> >>         char dest[16];
> >>         strscpy(dest, "12345", sizeof(dest)):
> > 
> > Ugh, ok, yes.
> > 
> >> For strscpy() that would mean making the *whole* read from 'src' buffer unchecked by KASAN.
> > 
> > So we do have that READ_ONCE_NOCHECK(), but could we perhaps have
> > something that doesn't do a NOCHECK but a partial check and is simply
> > ok with "this is an optimistc longer access"
> > 
> 
> This can be dont, I think.
> 
> Something like this:
> static inline unsigned long read_partial_nocheck(unsigned long *x)
> {
> 	unsigned long ret = READ_ONCE_NOCHECK(x);
> 	kasan_check_partial(x, sizeof(unsigned long));
> 	return ret;
> }
> 

(Cc Chris)

We could just remove all that word-at-a-time logic.  Do we have any
evidence that this would harm anything?

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

* Re: [PATCH] lib/strscpy: avoid KASAN false positive
  2017-07-18 22:04         ` Andrew Morton
@ 2017-07-18 22:35           ` Linus Torvalds
  2017-07-19  7:46             ` Dmitry Vyukov
  2017-07-19 15:39           ` Chris Metcalf
  1 sibling, 1 reply; 13+ messages in thread
From: Linus Torvalds @ 2017-07-18 22:35 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Andrey Ryabinin, Dave Jones, Alexander Potapenko, Dmitry Vyukov,
	kasan-dev, Linux Kernel Mailing List, Chris Metcalf

On Tue, Jul 18, 2017 at 3:04 PM, Andrew Morton
<akpm@linux-foundation.org> wrote:
>
> We could just remove all that word-at-a-time logic.  Do we have any
> evidence that this would harm anything?

One option would be to simply make reads more permissive, and only
check the first byte of the read (unlike the last, which is what it
does now). Obviously within the normal KASAN granularity level (which
I think is 8 byte aligned anyway).

Checking *writes* more carefully is obviously a good idea regardless.
But the whole "do big reads" is pretty common for a lot of memory and
string copies.

So maybe the whole KASAN_SHADOW_MASK thing could be limited to just
the write side?

That would certainly simplify things. How much it would hurt coverage
would be something that the people who have analyzed KASAN reports so
far would have to judge. Have any of the existing KASAN reports been
due to the KASAN_SHADOW_SCALE level read tests?

           Linus

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

* Re: [PATCH] lib/strscpy: avoid KASAN false positive
  2017-07-18 22:35           ` Linus Torvalds
@ 2017-07-19  7:46             ` Dmitry Vyukov
  0 siblings, 0 replies; 13+ messages in thread
From: Dmitry Vyukov @ 2017-07-19  7:46 UTC (permalink / raw)
  To: Linus Torvalds
  Cc: Andrew Morton, Andrey Ryabinin, Dave Jones, Alexander Potapenko,
	kasan-dev, Linux Kernel Mailing List, Chris Metcalf

On Wed, Jul 19, 2017 at 12:35 AM, Linus Torvalds
<torvalds@linux-foundation.org> wrote:
> On Tue, Jul 18, 2017 at 3:04 PM, Andrew Morton
> <akpm@linux-foundation.org> wrote:
>>
>> We could just remove all that word-at-a-time logic.  Do we have any
>> evidence that this would harm anything?
>
> One option would be to simply make reads more permissive, and only
> check the first byte of the read (unlike the last, which is what it
> does now). Obviously within the normal KASAN granularity level (which
> I think is 8 byte aligned anyway).
>
> Checking *writes* more carefully is obviously a good idea regardless.
> But the whole "do big reads" is pretty common for a lot of memory and
> string copies.
>
> So maybe the whole KASAN_SHADOW_MASK thing could be limited to just
> the write side?
>
> That would certainly simplify things. How much it would hurt coverage
> would be something that the people who have analyzed KASAN reports so
> far would have to judge. Have any of the existing KASAN reports been
> due to the KASAN_SHADOW_SCALE level read tests?

We've seen a bunch of such out-of-bounds KASAN reports -- on strings,
network packets, other binary data. I would be very much against
relaxing the general C rules for the two cases of formally incorrect C
code.

I see 3 ways out:

1. What Andrew mentioned -- don't do out of bounds reads. Solves the
problem with perfectly clean code.
I guess now people may ask for benchmarks for the change that removes
the optimization. But looking at the change that introduced it, it was
never benchmarked in the first place. And the description actually
explicitly says that we do this just-in-case and that this is not
performance critical:

    - The implementation should be reasonably performant on all
      platforms since it uses the asm/word-at-a-time.h API rather than
      simple byte copy.  Kernel-to-kernel string copy is not considered
      to be performance critical in any case.

2. Assuming we want to have both out-of-bounds reads and KASAN, deal
with it on a case-by-base basis.
For strscpy, not checking accesses at all looks like the worst option
because we will miss off-by-page accesses and use-after-free's (as
Andrey already mentioned).
Introducing read_partial_nocheck looks like the second worst, because
it introduces a one off interface routine.
Between setting max=0 and using READ_ONCE_NOCHECK+kasan_check_read I
don't have a strong preference. Setting max=0 looks simpler and less
intrusive, though.

And, yes, what we do in dcache looks worse because (1), it's
higher-level code rather than a low-level routine (and we generally
don't want to sprinkle KASAN-anything in high-level code) and (2)
unpoisoning the trailer unpoisons it for all accesses (even the ones
that unintentionally access out-of-bounds).

3. Adapt kernel memory protection model. Currently it assumes that an
arch provides protection only on page granularity. But KASAN is
effectively an arch with ultimate segmentation where each heap block
gets an own segment with precise size (equivalent to the abstract C
machine as well). So we could introduce PROTECTION_GRANULARITY
constant which is usually PAGE_SIZE, but 1 for KASAN. Then we can
write clean code based on this model. But I am not sure we want to go
this route while we have only 2 cases. And effectively we will still
have different code executed under KASAN.

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

* Re: [PATCH] lib/strscpy: avoid KASAN false positive
  2017-07-18 22:04         ` Andrew Morton
  2017-07-18 22:35           ` Linus Torvalds
@ 2017-07-19 15:39           ` Chris Metcalf
  2017-07-19 16:05             ` Dave Jones
  1 sibling, 1 reply; 13+ messages in thread
From: Chris Metcalf @ 2017-07-19 15:39 UTC (permalink / raw)
  To: Andrew Morton, Andrey Ryabinin
  Cc: Linus Torvalds, Dave Jones, Alexander Potapenko, Dmitry Vyukov,
	kasan-dev, Linux Kernel Mailing List, Chris Metcalf

On 7/18/2017 6:04 PM, Andrew Morton wrote:
> On Wed, 19 Jul 2017 00:31:36 +0300 Andrey Ryabinin <aryabinin@virtuozzo.com> wrote:
>
>> On 07/18/2017 11:26 PM, Linus Torvalds wrote:
>>> On Tue, Jul 18, 2017 at 1:15 PM, Andrey Ryabinin
>>> <aryabinin@virtuozzo.com> wrote:
>>>> No, it does warn about valid users. The report that Dave posted wasn't about wrong strscpy() usage
>>>> it was about reading 8-bytes from 5-bytes source string. It wasn't about buggy 'count' at all.
>>>> So KASAN will warn for perfectly valid code like this:
>>>>          char dest[16];
>>>>          strscpy(dest, "12345", sizeof(dest)):
>>> Ugh, ok, yes.
>>>
>>>> For strscpy() that would mean making the *whole* read from 'src' buffer unchecked by KASAN.
>>> So we do have that READ_ONCE_NOCHECK(), but could we perhaps have
>>> something that doesn't do a NOCHECK but a partial check and is simply
>>> ok with "this is an optimistc longer access"
>>>
>> This can be dont, I think.
>>
>> Something like this:
>> static inline unsigned long read_partial_nocheck(unsigned long *x)
>> {
>> 	unsigned long ret = READ_ONCE_NOCHECK(x);
>> 	kasan_check_partial(x, sizeof(unsigned long));
>> 	return ret;
>> }
>>
> (Cc Chris)
>
> We could just remove all that word-at-a-time logic.  Do we have any
> evidence that this would harm anything?

The word-at-a-time logic was part of the initial commit since I wanted
to ensure that strscpy could be used to replace strlcpy or strncpy without
serious concerns about performance.  It seems unfortunate to remove it
unconditionally to support KASAN, but I haven't looked deeply at the
tradeoffs here.

-- 
Chris Metcalf, Mellanox Technologies
http://www.mellanox.com

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

* Re: [PATCH] lib/strscpy: avoid KASAN false positive
  2017-07-19 15:39           ` Chris Metcalf
@ 2017-07-19 16:05             ` Dave Jones
  2017-07-26 12:05               ` Dmitry Vyukov
  0 siblings, 1 reply; 13+ messages in thread
From: Dave Jones @ 2017-07-19 16:05 UTC (permalink / raw)
  To: Chris Metcalf
  Cc: Andrew Morton, Andrey Ryabinin, Linus Torvalds,
	Alexander Potapenko, Dmitry Vyukov, kasan-dev,
	Linux Kernel Mailing List, Chris Metcalf

On Wed, Jul 19, 2017 at 11:39:32AM -0400, Chris Metcalf wrote:
 
 > > We could just remove all that word-at-a-time logic.  Do we have any
 > > evidence that this would harm anything?
 > 
 > The word-at-a-time logic was part of the initial commit since I wanted
 > to ensure that strscpy could be used to replace strlcpy or strncpy without
 > serious concerns about performance.

I'm curious what the typical length of the strings we're concerned about
in this case are if this makes a difference.

	Dave

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

* Re: [PATCH] lib/strscpy: avoid KASAN false positive
  2017-07-19 16:05             ` Dave Jones
@ 2017-07-26 12:05               ` Dmitry Vyukov
  0 siblings, 0 replies; 13+ messages in thread
From: Dmitry Vyukov @ 2017-07-26 12:05 UTC (permalink / raw)
  To: Dave Jones, Chris Metcalf, Andrew Morton, Andrey Ryabinin,
	Linus Torvalds, Alexander Potapenko, Dmitry Vyukov, kasan-dev,
	Linux Kernel Mailing List, Chris Metcalf

On Wed, Jul 19, 2017 at 6:05 PM, Dave Jones <davej@codemonkey.org.uk> wrote:
> On Wed, Jul 19, 2017 at 11:39:32AM -0400, Chris Metcalf wrote:
>
>  > > We could just remove all that word-at-a-time logic.  Do we have any
>  > > evidence that this would harm anything?
>  >
>  > The word-at-a-time logic was part of the initial commit since I wanted
>  > to ensure that strscpy could be used to replace strlcpy or strncpy without
>  > serious concerns about performance.
>
> I'm curious what the typical length of the strings we're concerned about
> in this case are if this makes a difference.


My vote is for proceeding with the original Andrey's patch. It's not
perfect, but it's simple, short, minimally intrusive and fixes the
problem at hand. We can do something more fundamental when/if we have
more such cases.

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

end of thread, other threads:[~2017-07-26 12:06 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-18 17:15 [PATCH] lib/strscpy: avoid KASAN false positive Andrey Ryabinin
2017-07-18 17:14 ` Dmitry Vyukov
2017-07-18 17:22 ` Linus Torvalds
2017-07-18 20:15   ` Andrey Ryabinin
2017-07-18 20:26     ` Linus Torvalds
2017-07-18 21:31       ` Andrey Ryabinin
2017-07-18 21:32         ` Andrey Ryabinin
2017-07-18 22:04         ` Andrew Morton
2017-07-18 22:35           ` Linus Torvalds
2017-07-19  7:46             ` Dmitry Vyukov
2017-07-19 15:39           ` Chris Metcalf
2017-07-19 16:05             ` Dave Jones
2017-07-26 12:05               ` Dmitry Vyukov

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).