From: John Fastabend <john.fastabend@gmail.com>
To: Eric Dumazet <eric.dumazet@gmail.com>,
ast@kernel.org, daniel@iogearbox.net
Cc: netdev@vger.kernel.org
Subject: Re: [bpf-next v2 1/2] bpf: skmsg, fix psock create on existing kcm/tls port
Date: Thu, 18 Oct 2018 13:24:40 -0700 [thread overview]
Message-ID: <229054a9-a323-e8e3-5cb8-f29c8fa5f666@gmail.com> (raw)
In-Reply-To: <cfd54e59-a1e1-ae83-ee10-2f28cb869d4f@gmail.com>
On 10/18/2018 10:34 AM, Eric Dumazet wrote:
>
>
> On 10/17/2018 10:20 PM, John Fastabend wrote:
>> Before using the psock returned by sk_psock_get() when adding it to a
>> sockmap we need to ensure it is actually a sockmap based psock.
>> Previously we were only checking this after incrementing the reference
>> counter which was an error. This resulted in a slab-out-of-bounds
>> error when the psock was not actually a sockmap type.
>>
>> This moves the check up so the reference counter is only used
>> if it is a sockmap psock.
>>
>> Eric reported the following KASAN BUG,
>>
>> BUG: KASAN: slab-out-of-bounds in atomic_read include/asm-generic/atomic-instrumented.h:21 [inline]
>> BUG: KASAN: slab-out-of-bounds in refcount_inc_not_zero_checked+0x97/0x2f0 lib/refcount.c:120
>> Read of size 4 at addr ffff88019548be58 by task syz-executor4/22387
>>
>> CPU: 1 PID: 22387 Comm: syz-executor4 Not tainted 4.19.0-rc7+ #264
>> Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
>> Call Trace:
>> __dump_stack lib/dump_stack.c:77 [inline]
>> dump_stack+0x1c4/0x2b4 lib/dump_stack.c:113
>> print_address_description.cold.8+0x9/0x1ff mm/kasan/report.c:256
>> kasan_report_error mm/kasan/report.c:354 [inline]
>> kasan_report.cold.9+0x242/0x309 mm/kasan/report.c:412
>> check_memory_region_inline mm/kasan/kasan.c:260 [inline]
>> check_memory_region+0x13e/0x1b0 mm/kasan/kasan.c:267
>> kasan_check_read+0x11/0x20 mm/kasan/kasan.c:272
>> atomic_read include/asm-generic/atomic-instrumented.h:21 [inline]
>> refcount_inc_not_zero_checked+0x97/0x2f0 lib/refcount.c:120
>> sk_psock_get include/linux/skmsg.h:379 [inline]
>> sock_map_link.isra.6+0x41f/0xe30 net/core/sock_map.c:178
>> sock_hash_update_common+0x19b/0x11e0 net/core/sock_map.c:669
>> sock_hash_update_elem+0x306/0x470 net/core/sock_map.c:738
>> map_update_elem+0x819/0xdf0 kernel/bpf/syscall.c:818
>>
>> Signed-off-by: John Fastabend <john.fastabend@gmail.com>
>> Reported-by: Eric Dumazet <eric.dumazet@gmail.com>
>> Fixes: 604326b41a6f ("bpf, sockmap: convert to generic sk_msg interface")
>> ---
[...]
>> +static inline struct sk_psock *sk_psock_get_checked(struct sock *sk)
>> +{
>> + struct sk_psock *psock;
>> +
>> + rcu_read_lock();
>> + psock = sk_psock(sk);
>> + if (psock) {
>> + if (sk->sk_prot->recvmsg != tcp_bpf_recvmsg) {
>> + psock = ERR_PTR(-EBUSY);
>> + goto out;
>> + }
>> +
>> + if (!refcount_inc_not_zero(&psock->refcnt))
>> + psock = NULL;
>
> Caller is using IS_ERR(), so you probably want to :
>
> psock = ERR_PTR(-E<something>);
>
>
Yeah we can make this EBUSY as well. Originally I was
thinking that we could create the psock and attach it in
this case but it would be racy and require an rcu sync
most likely.
To hit this case users would need to have multiple
maps and be adding/deleting socks from those maps at
the same time. Seems pretty rare and not worth punishing
the normal case with synchronization.
Nice catch.
.John
next prev parent reply other threads:[~2018-10-19 4:27 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-18 5:20 [bpf-next v2 0/2] Fix kcm + sockmap by checking psock type John Fastabend
2018-10-18 5:20 ` [bpf-next v2 1/2] bpf: skmsg, fix psock create on existing kcm/tls port John Fastabend
2018-10-18 17:34 ` Eric Dumazet
2018-10-18 20:24 ` John Fastabend [this message]
2018-10-18 5:20 ` [bpf-next v2 2/2] bpf: test_maps add a test to catch kcm + sockmap John Fastabend
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=229054a9-a323-e8e3-5cb8-f29c8fa5f666@gmail.com \
--to=john.fastabend@gmail.com \
--cc=ast@kernel.org \
--cc=daniel@iogearbox.net \
--cc=eric.dumazet@gmail.com \
--cc=netdev@vger.kernel.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;
as well as URLs for NNTP newsgroup(s).