Re: [PATCH bpf-next] selftest/bpf: testing for multiple logs on REJECT

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jan 27, 2021 at 6:24 PM Daniel Borkmann <daniel@xxxxxxxxxxxxx> wrote:
>
> On 1/27/21 3:31 AM, Andrei Matei wrote:
> > On Tue, Jan 26, 2021 at 6:21 PM Daniel Borkmann <daniel@xxxxxxxxxxxxx> wrote:
> >> On 1/24/21 8:05 PM, Andrei Matei wrote:
> >>> This patch adds support to verifier tests to check for a succession of
> >>> verifier log messages on program load failure. This makes the
> >>> errstr field work uniformly across REJECT and VERBOSE_ACCEPT checks.
> >>>
> >>> This patch also increases the maximum size of an accepted series of
> >>> messages to test from 80 chars to 200 chars. This is in order to keep
> >>> existing tests working, which sometimes test for messages larger than 80
> >>> chars (which was accepted in the REJECT case, when testing for a single
> >>> message, but ironically not in the VERBOSE_ACCEPT case, when testing for
> >>> possibly multiple messages).
> >>> And example of such a long, checked message is in bounds.c:
> >>> "R1 has unknown scalar with mixed signed bounds, pointer arithmetic with
> >>> it prohibited for !root"
> >>>
> >>> Signed-off-by: Andrei Matei <andreimatei1@xxxxxxxxx>
> >>> ---
> >>>    tools/testing/selftests/bpf/test_verifier.c | 15 ++++++++++++---
> >>>    1 file changed, 12 insertions(+), 3 deletions(-)
> >>>
> >>> diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
> >>> index 59bfa6201d1d..69298bf8ee86 100644
> >>> --- a/tools/testing/selftests/bpf/test_verifier.c
> >>> +++ b/tools/testing/selftests/bpf/test_verifier.c
> >>> @@ -88,6 +88,9 @@ struct bpf_test {
> >>>        int fixup_map_event_output[MAX_FIXUPS];
> >>>        int fixup_map_reuseport_array[MAX_FIXUPS];
> >>>        int fixup_map_ringbuf[MAX_FIXUPS];
> >>> +     /* Expected verifier log output for result REJECT or VERBOSE_ACCEPT. Can be a
> >>> +      * tab-separated sequence of expected strings.
> >>> +      */
> >>>        const char *errstr;
> >>>        const char *errstr_unpriv;
> >>>        uint32_t insn_processed;
> >>> @@ -995,9 +998,11 @@ static int do_prog_test_run(int fd_prog, bool unpriv, uint32_t expected_val,
> >>>        return 0;
> >>>    }
> >>>
> >>> +/* Returns true if every part of exp (tab-separated) appears in log, in order.
> >>> + */
> >>>    static bool cmp_str_seq(const char *log, const char *exp)
> >>>    {
> >>> -     char needle[80];
> >>> +     char needle[200];
> >>>        const char *p, *q;
> >>>        int len;
> >>>
> >>> @@ -1015,7 +1020,7 @@ static bool cmp_str_seq(const char *log, const char *exp)
> >>>                needle[len] = 0;
> >>>                q = strstr(log, needle);
> >>>                if (!q) {
> >>> -                     printf("FAIL\nUnexpected verifier log in successful load!\n"
> >>> +                     printf("FAIL\nUnexpected verifier log!\n"
> >>>                               "EXP: %s\nRES:\n", needle);
> >>>                        return false;
> >>>                }
> >>> @@ -1130,7 +1135,11 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
> >>>                        printf("FAIL\nUnexpected success to load!\n");
> >>>                        goto fail_log;
> >>>                }
> >>> -             if (!expected_err || !strstr(bpf_vlog, expected_err)) {
> >>> +             if (!expected_err) {
> >>> +                     printf("FAIL\nTestcase bug; missing expected_err\n");
> >>> +                     goto fail_log;
> >>
> >> Do we have an in-tree case like this?
> >
> > You're asking if there are tests with expected_res == REJECT and
> > expected_err == NULL?
> > There are no such test cases, and the intention of this "testcase bug"
> > check was to keep it that way.
> > I can simply fold it into the test failure below, as you're suggesting.
>
> Yeah, I would just fold it given such issue would be visible there as well.
>
> >> Given this would also be visible below with 'EXP:'
> >> being (null), I might simplify and just replace the strstr() with cmp_str_seq().
> >>
> >> Also, could you elaborate on which test cases need the cmp_str_seq() conversion?
> >
> > There are VERBOSE_ACCEPT tests that you a tab-separated list of
> > expected messages; see precise.c.
> > There are no such REJECT tests yet. I was about to introduce one in
> > another patch that's inflight, but I ended
> > up not needing to. Still, I figured that unifying the capabilities of
> > .errstr between VERBOSE_ACCEPT and REJECT
> > is a good idea.
> I think unifying seems reasonable, lets do then.

Please see v2. I've had to do a small change to cmp_str_seq to have it
declare success when looking for "". This is to keep a couple of
existing tests happy which expected REJECT but didn't want to check
any log message.

>
> Thanks,
> Daniel



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux