BPF List
 help / color / mirror / Atom feed
From: Lorenz Bauer <lmb@cloudflare.com>
To: ast@kernel.org, yhs@fb.com, daniel@iogearbox.net, kafai@fb.com,
	andriin@fb.com
Cc: bpf@vger.kernel.org, kernel-team@cloudflare.com,
	Lorenz Bauer <lmb@cloudflare.com>
Subject: [PATCH bpf-next v2 00/11] Make check_func_arg type checks table driven
Date: Wed,  9 Sep 2020 18:11:44 +0100	[thread overview]
Message-ID: <20200909171155.256601-1-lmb@cloudflare.com> (raw)

Thanks for all the valuable feedback! The series now doesn't depend
on sockmap iterator anymore. All of this is refactoring, no
functional changes are intended.

Once this + sockmap iter are merged I'll submit a series that
introduces ARG_PTR_TO_SOCK_COMMON_OR_NULL which aliases with
a BTF struct sock_common*. This in turn will allow me to call
map_update_elem(sockmap) from bpf_iter context.

Changes in v2:
- Make the series stand alone (Martin)
- Drop incorrect BTF_SET_START fix (Andrii)
- Only support a single BTF ID per argument (Martin)
- Introduce BTF_ID_LIST_SINGLE macro (Andrii)
- Skip check_ctx_reg iff register is NULL
- Change output of check_reg_type slightly, to avoid touching tests

Original cover letter:

Currently, check_func_arg has this pretty gnarly if statement that
compares the valid arg_type with the actualy reg_type. Sprinkled
in-between are checks for register_is_null, to short circuit these
tests if we're dealing with a nullable arg_type. There is also some
code for later bounds / access checking hidden away in there.

This series of patches refactors the function into something like this:

   if (reg_is_null && arg_type_is_nullable)
     skip type checking

   do type checking, including BTF validation

   do bounds / access checking

The type checking is now table driven, which makes it easy to extend
the acceptable types. Maybe more importantly, using a table makes it
easy to provide more helpful verifier output (see the last patch).

Lorenz Bauer (11):
  btf: make btf_set_contains take a const pointer
  bpf: check scalar or invalid register in check_helper_mem_access
  btf: Add BTF_ID_LIST_SINGLE macro
  bpf: allow specifying a BTF ID per argument in function protos
  bpf: make BTF pointer type checking generic
  bpf: make reference tracking generic
  bpf: make context access check generic
  bpf: set meta->raw_mode for pointers close to use
  bpf: check ARG_PTR_TO_SPINLOCK register type in check_func_arg
  bpf: hoist type checking for nullable arg types
  bpf: use a table to drive helper arg type checks

 include/linux/bpf.h            |  21 ++-
 include/linux/btf_ids.h        |   7 +
 kernel/bpf/bpf_inode_storage.c |   8 +-
 kernel/bpf/btf.c               |  15 +-
 kernel/bpf/stackmap.c          |   5 +-
 kernel/bpf/verifier.c          | 332 ++++++++++++++++++---------------
 kernel/trace/bpf_trace.c       |  15 +-
 net/core/bpf_sk_storage.c      |  10 +-
 net/core/filter.c              |  31 +--
 net/ipv4/bpf_tcp_ca.c          |  19 +-
 10 files changed, 227 insertions(+), 236 deletions(-)

-- 
2.25.1


             reply	other threads:[~2020-09-09 17:12 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-09 17:11 Lorenz Bauer [this message]
2020-09-09 17:11 ` [PATCH bpf-next v2 01/11] btf: make btf_set_contains take a const pointer Lorenz Bauer
2020-09-09 17:11 ` [PATCH bpf-next v2 02/11] bpf: check scalar or invalid register in check_helper_mem_access Lorenz Bauer
2020-09-09 17:11 ` [PATCH bpf-next v2 03/11] btf: Add BTF_ID_LIST_SINGLE macro Lorenz Bauer
2020-09-09 18:09   ` Martin KaFai Lau
2020-09-10 18:49   ` Andrii Nakryiko
2020-09-09 17:11 ` [PATCH bpf-next v2 04/11] bpf: allow specifying a BTF ID per argument in function protos Lorenz Bauer
2020-09-09 20:03   ` Martin KaFai Lau
2020-09-10 11:36     ` Lorenz Bauer
2020-09-10 18:51     ` Andrii Nakryiko
2020-09-09 17:11 ` [PATCH bpf-next v2 05/11] bpf: make BTF pointer type checking generic Lorenz Bauer
2020-09-09 20:15   ` Martin KaFai Lau
2020-09-09 17:11 ` [PATCH bpf-next v2 06/11] bpf: make reference tracking generic Lorenz Bauer
2020-09-09 20:21   ` Martin KaFai Lau
2020-09-09 17:11 ` [PATCH bpf-next v2 07/11] bpf: make context access check generic Lorenz Bauer
2020-09-09 20:42   ` Martin KaFai Lau
2020-09-09 17:11 ` [PATCH bpf-next v2 08/11] bpf: set meta->raw_mode for pointers close to use Lorenz Bauer
2020-09-09 21:04   ` Martin KaFai Lau
2020-09-09 17:11 ` [PATCH bpf-next v2 09/11] bpf: check ARG_PTR_TO_SPINLOCK register type in check_func_arg Lorenz Bauer
2020-09-09 21:14   ` Martin KaFai Lau
2020-09-09 17:11 ` [PATCH bpf-next v2 10/11] bpf: hoist type checking for nullable arg types Lorenz Bauer
2020-09-09 21:28   ` Martin KaFai Lau
2020-09-09 17:11 ` [PATCH bpf-next v2 11/11] bpf: use a table to drive helper arg type checks Lorenz Bauer
2020-09-09 22:22   ` Martin KaFai Lau

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=20200909171155.256601-1-lmb@cloudflare.com \
    --to=lmb@cloudflare.com \
    --cc=andriin@fb.com \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=kafai@fb.com \
    --cc=kernel-team@cloudflare.com \
    --cc=yhs@fb.com \
    /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