2020-10-06 23:48:15

by Hao Luo

[permalink] [raw]
Subject: [PATCH] bpf: Fix test_verifier after introducing resolve_pseudo_ldimm64

Commit 4976b718c355 ("bpf: Introduce pseudo_btf_id") switched
the order of check_subprogs() and resolve_pseudo_ldimm() in
the verifier. Now an empty prog and the prog of a single
invalid ldimm expect to see the error "last insn is not an
exit or jmp" instead, because the check for subprogs comes
first. Fix the expection of the error message.

Tested:
# ./test_verifier
Summary: 1130 PASSED, 538 SKIPPED, 0 FAILED
and the full set of bpf selftests.

Fixes: 4976b718c355 ("bpf: Introduce pseudo_btf_id")
Signed-off-by: Hao Luo <[email protected]>
---
tools/testing/selftests/bpf/verifier/basic.c | 2 +-
tools/testing/selftests/bpf/verifier/ld_imm64.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/bpf/verifier/basic.c b/tools/testing/selftests/bpf/verifier/basic.c
index b8d18642653a..de84f0d57082 100644
--- a/tools/testing/selftests/bpf/verifier/basic.c
+++ b/tools/testing/selftests/bpf/verifier/basic.c
@@ -2,7 +2,7 @@
"empty prog",
.insns = {
},
- .errstr = "unknown opcode 00",
+ .errstr = "last insn is not an exit or jmp",
.result = REJECT,
},
{
diff --git a/tools/testing/selftests/bpf/verifier/ld_imm64.c b/tools/testing/selftests/bpf/verifier/ld_imm64.c
index 3856dba733e9..f300ba62edd0 100644
--- a/tools/testing/selftests/bpf/verifier/ld_imm64.c
+++ b/tools/testing/selftests/bpf/verifier/ld_imm64.c
@@ -55,7 +55,7 @@
.insns = {
BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0),
},
- .errstr = "invalid bpf_ld_imm64 insn",
+ .errstr = "last insn is not an exit or jmp",
.result = REJECT,
},
{
--
2.28.0.806.g8561365e88-goog


2020-10-07 00:46:06

by Andrii Nakryiko

[permalink] [raw]
Subject: Re: [PATCH] bpf: Fix test_verifier after introducing resolve_pseudo_ldimm64

On Tue, Oct 6, 2020 at 4:45 PM Hao Luo <[email protected]> wrote:
>
> Commit 4976b718c355 ("bpf: Introduce pseudo_btf_id") switched
> the order of check_subprogs() and resolve_pseudo_ldimm() in
> the verifier. Now an empty prog and the prog of a single
> invalid ldimm expect to see the error "last insn is not an
> exit or jmp" instead, because the check for subprogs comes
> first. Fix the expection of the error message.
>
> Tested:
> # ./test_verifier
> Summary: 1130 PASSED, 538 SKIPPED, 0 FAILED
> and the full set of bpf selftests.
>
> Fixes: 4976b718c355 ("bpf: Introduce pseudo_btf_id")
> Signed-off-by: Hao Luo <[email protected]>
> ---
> tools/testing/selftests/bpf/verifier/basic.c | 2 +-
> tools/testing/selftests/bpf/verifier/ld_imm64.c | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/tools/testing/selftests/bpf/verifier/basic.c b/tools/testing/selftests/bpf/verifier/basic.c
> index b8d18642653a..de84f0d57082 100644
> --- a/tools/testing/selftests/bpf/verifier/basic.c
> +++ b/tools/testing/selftests/bpf/verifier/basic.c
> @@ -2,7 +2,7 @@
> "empty prog",
> .insns = {
> },
> - .errstr = "unknown opcode 00",
> + .errstr = "last insn is not an exit or jmp",

in this case the new message makes more sense, so this is a good change

> .result = REJECT,
> },
> {
> diff --git a/tools/testing/selftests/bpf/verifier/ld_imm64.c b/tools/testing/selftests/bpf/verifier/ld_imm64.c
> index 3856dba733e9..f300ba62edd0 100644
> --- a/tools/testing/selftests/bpf/verifier/ld_imm64.c
> +++ b/tools/testing/selftests/bpf/verifier/ld_imm64.c
> @@ -55,7 +55,7 @@
> .insns = {
> BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0),
> },
> - .errstr = "invalid bpf_ld_imm64 insn",
> + .errstr = "last insn is not an exit or jmp",

but this completely defeats the purpose of the test; better add
BPF_EXIT_INSN() after ldimm64 instruction to actually get to
validation of ldimm64

> .result = REJECT,
> },
> {
> --
> 2.28.0.806.g8561365e88-goog
>

2020-10-07 01:09:59

by Andrii Nakryiko

[permalink] [raw]
Subject: Re: [PATCH] bpf: Fix test_verifier after introducing resolve_pseudo_ldimm64

On Tue, Oct 6, 2020 at 5:51 PM Hao Luo <[email protected]> wrote:
>
> On Tue, Oct 6, 2020 at 5:43 PM Andrii Nakryiko
> <[email protected]> wrote:
> >
> > On Tue, Oct 6, 2020 at 4:45 PM Hao Luo <[email protected]> wrote:
> > >
> > > Commit 4976b718c355 ("bpf: Introduce pseudo_btf_id") switched
> > > the order of check_subprogs() and resolve_pseudo_ldimm() in
> > > the verifier. Now an empty prog and the prog of a single
> > > invalid ldimm expect to see the error "last insn is not an
> > > exit or jmp" instead, because the check for subprogs comes
> > > first. Fix the expection of the error message.
> > >
> > > Tested:
> > > # ./test_verifier
> > > Summary: 1130 PASSED, 538 SKIPPED, 0 FAILED
> > > and the full set of bpf selftests.
> > >
> > > Fixes: 4976b718c355 ("bpf: Introduce pseudo_btf_id")
> > > Signed-off-by: Hao Luo <[email protected]>
> > > ---
> [...]
> > > diff --git a/tools/testing/selftests/bpf/verifier/ld_imm64.c b/tools/testing/selftests/bpf/verifier/ld_imm64.c
> > > index 3856dba733e9..f300ba62edd0 100644
> > > --- a/tools/testing/selftests/bpf/verifier/ld_imm64.c
> > > +++ b/tools/testing/selftests/bpf/verifier/ld_imm64.c
> > > @@ -55,7 +55,7 @@
> > > .insns = {
> > > BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0),
> > > },
> > > - .errstr = "invalid bpf_ld_imm64 insn",
> > > + .errstr = "last insn is not an exit or jmp",
> >
> > but this completely defeats the purpose of the test; better add
> > BPF_EXIT_INSN() after ldimm64 instruction to actually get to
> > validation of ldimm64
> >
>
> Actually there is already a test (test4) that covers this case. So it
> makes sense to remove it, I think. I will resend with this change.

ah, this test validates that half of ldimm64 at the very end won't
cause any troubles to verifier... Yeah, I guess now it's pointless
because it can never be the very last instruction.

>
> > > .result = REJECT,
> > > },
> > > {
> > > --
> > > 2.28.0.806.g8561365e88-goog
> > >

2020-10-07 01:45:08

by Hao Luo

[permalink] [raw]
Subject: Re: [PATCH] bpf: Fix test_verifier after introducing resolve_pseudo_ldimm64

On Tue, Oct 6, 2020 at 5:43 PM Andrii Nakryiko
<[email protected]> wrote:
>
> On Tue, Oct 6, 2020 at 4:45 PM Hao Luo <[email protected]> wrote:
> >
> > Commit 4976b718c355 ("bpf: Introduce pseudo_btf_id") switched
> > the order of check_subprogs() and resolve_pseudo_ldimm() in
> > the verifier. Now an empty prog and the prog of a single
> > invalid ldimm expect to see the error "last insn is not an
> > exit or jmp" instead, because the check for subprogs comes
> > first. Fix the expection of the error message.
> >
> > Tested:
> > # ./test_verifier
> > Summary: 1130 PASSED, 538 SKIPPED, 0 FAILED
> > and the full set of bpf selftests.
> >
> > Fixes: 4976b718c355 ("bpf: Introduce pseudo_btf_id")
> > Signed-off-by: Hao Luo <[email protected]>
> > ---
[...]
> > diff --git a/tools/testing/selftests/bpf/verifier/ld_imm64.c b/tools/testing/selftests/bpf/verifier/ld_imm64.c
> > index 3856dba733e9..f300ba62edd0 100644
> > --- a/tools/testing/selftests/bpf/verifier/ld_imm64.c
> > +++ b/tools/testing/selftests/bpf/verifier/ld_imm64.c
> > @@ -55,7 +55,7 @@
> > .insns = {
> > BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, 0, 0, 0, 0),
> > },
> > - .errstr = "invalid bpf_ld_imm64 insn",
> > + .errstr = "last insn is not an exit or jmp",
>
> but this completely defeats the purpose of the test; better add
> BPF_EXIT_INSN() after ldimm64 instruction to actually get to
> validation of ldimm64
>

Actually there is already a test (test4) that covers this case. So it
makes sense to remove it, I think. I will resend with this change.

> > .result = REJECT,
> > },
> > {
> > --
> > 2.28.0.806.g8561365e88-goog
> >