mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andrey Ryabinin <aryabinin@virtuozzo.com>
To: Linus Torvalds <torvalds@linux-foundation.org>,
	Dave Jones <davej@codemonkey.org.uk>,
	Anna Schumaker <schumaker.anna@gmail.com>,
	Linux NFS Mailing List <linux-nfs@vger.kernel.org>,
	linux-fsdevel <linux-fsdevel@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	"J. Bruce Fields" <bfields@fieldses.org>,
	Alexander Potapenko <glider@google.com>,
	Dmitry Vyukov <dvyukov@google.com>
Cc: kasan-dev@googlegroups.com
Subject: Re: [GIT PULL] Please pull NFS client changes for Linux 4.13
Date: Fri, 14 Jul 2017 22:43:07 +0300	[thread overview]
Message-ID: <4c68e120-5ada-6ce1-30fd-e26155c9704e@virtuozzo.com> (raw)
In-Reply-To: <CA+55aFx=jOBws09qMfOyy22uz6CxezfS_DbKs7Ks6ZNqeZN6sQ@mail.gmail.com>



On 07/14/2017 10:05 PM, Linus Torvalds wrote:
> On Fri, Jul 14, 2017 at 7:25 AM, Dave Jones <davej@codemonkey.org.uk> wrote:
>> On Thu, Jul 13, 2017 at 05:16:24PM -0400, Anna Schumaker wrote:
>>  >
>>  >   git://git.linux-nfs.org/projects/anna/linux-nfs.git tags/nfs-for-4.13-1
>>
>> Since this landed, I'm seeing this during boot..
>>
>>  ==================================================================
>>  BUG: KASAN: global-out-of-bounds in strscpy+0x4a/0x230
>>  Read of size 8 at addr ffffffffb4eeaf20 by task nfsd/688
> 
> Is KASAN aware that strscpy() does the word-at-a-time optimistic reads
> of the sources?
> 

Nope.

> The problem may be that the source is initialized from the global
> string "nfsd", and KASAN may be unhappy abotu the fact that we read 8
> bytes from a 5-byte string (four plus NUL) as we do the word-at-a-time
> strscpy..
> 

Right.

> That said, we do check the size first (because we also *write* 8 bytes
> at a time), so maybe KASAN shouldn't even need to care.
>

Perhaps we could fallback to unoptimzed copy for KASAN case by setting max = 0
in strscpy().

 
> Hmm. it really looks to me like this is actually a compiler bug (I'm
> using current gcc in F26, which is gcc-7.1.1 - I'm assuming DaveJ is
> the same).
> 
> This is the source code in __ip_map_lookup:
> 
>         struct ip_map ip;
>      .....
>         strcpy(ip.m_class, class);
> 
> and "m_class" is 8 bytes in size:
> 
>     struct ip_map {
>     ...
>             char                    m_class[8]; /* e.g. "nfsd" */
>     ...
> 
> yet when I look at the generated code for __ip_map_lookup, I see
> 
>         movl    $32, %edx       #,
>         movq    %r13, %rsi      # class,
>         leaq    48(%rax), %rdi  #, tmp126
>         call    strscpy #
> 
> what's the bug here? Look at that third argume8nt - %rdx. It is
> initialized to 32.
> 
> WTF?
> 


It's not a compiler bug, it's a bug in our strcpy().
Whoever wrote this strcpy() into strscpy() code apparently didn't read carefully
enough gcc manual about __builtin_object_size().

Summary from https://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html :

	__builtin_object_size(ptr, type) returns a constant number of bytes from 'ptr' to the end of the object 'ptr'
	pointer points to. "type" is an integer constant from 0 to 3. If the least significant bit is clear, objects
	are whole variables, if it is set, a closest surrounding subobject is considered the object a pointer points to.
	The second bit determines if maximum or minimum of remaining bytes is computed. 

We have type = 0 in strcpy(), so the least significant bit is clear. So the 'ptr' is considered as a pointer to the whole
variable i.e. pointer to struct ip_map ip;
And the number of bytes from 'ip.m_class' to the end of the ip object is exactly 32.

I suppose that changing the type to 1 should fix this bug.



> The code to turn "strcpy()" into "strscpy()" should pick the *smaller*
> of the two object sizes as the size argument. How the hell is that
> size argument 32?
> 
> Am I missing something? DaveJ, do you see the same?
> 
>                        Linus
> 

  reply	other threads:[~2017-07-14 19:45 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-13 21:16 Anna Schumaker
2017-07-13 21:43 ` Linus Torvalds
2017-07-14  7:09   ` Christoph Hellwig
2017-07-14 11:33     ` Anna Schumaker
2017-07-14 14:25 ` Dave Jones
2017-07-14 16:36   ` J. Bruce Fields
2017-07-14 19:05   ` Linus Torvalds
2017-07-14 19:43     ` Andrey Ryabinin [this message]
2017-07-14 19:58       ` Linus Torvalds
2017-07-14 20:26         ` Andrey Rybainin
2017-07-14 20:38         ` Daniel Micay
2017-07-14 20:50           ` Linus Torvalds
2017-07-14 21:01             ` Daniel Micay
2017-07-14 21:05               ` Daniel Micay
2017-07-14 20:50           ` Daniel Micay
2017-07-14 23:59         ` Daniel Micay
2017-07-14 19:48     ` Dave Jones
2017-07-16 21:15   ` Dave Jones
2017-07-16 22:57     ` Trond Myklebust
2017-07-17  3:05       ` davej
2017-07-17 19:02         ` Linus Torvalds
2017-07-18 14:20           ` [GIT PULL] Please pull an nfsd bugfix for 4.13 bfields
2017-07-31 15:43           ` [GIT PULL] Please pull NFS client changes for Linux 4.13 davej
2017-08-01  5:35             ` Linus Torvalds
2017-08-01 15:51               ` davej
2017-08-01 17:20                 ` Linus Torvalds
2017-08-01 17:30                   ` Trond Myklebust
2017-08-01 17:50                   ` davej
2017-08-01 17:58                     ` Trond Myklebust
2017-08-01 17:53                   ` Linus Torvalds

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=4c68e120-5ada-6ce1-30fd-e26155c9704e@virtuozzo.com \
    --to=aryabinin@virtuozzo.com \
    --cc=bfields@fieldses.org \
    --cc=davej@codemonkey.org.uk \
    --cc=dvyukov@google.com \
    --cc=glider@google.com \
    --cc=kasan-dev@googlegroups.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=schumaker.anna@gmail.com \
    --cc=torvalds@linux-foundation.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®