On Sat, Jan 30, 2021 at 2:10 PM Andrei Matei <andreimatei1@xxxxxxxxx> 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 a message in the 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 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> Acked-by: Song Liu <songliubraving@xxxxxx> > --- > tools/testing/selftests/bpf/test_verifier.c | 16 +++++++++++++--- > 1 file changed, 13 insertions(+), 3 deletions(-) > > diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c > index 59bfa6201d1d..58b5a349d3ba 100644 > --- a/tools/testing/selftests/bpf/test_verifier.c > +++ b/tools/testing/selftests/bpf/test_verifier.c > @@ -88,6 +88,10 @@ 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. An empty string > + * means no log verification. > + */ > const char *errstr; > const char *errstr_unpriv; > uint32_t insn_processed; > @@ -995,13 +999,19 @@ 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. > + * > + * If exp is an empty string, returns true. > + */ > static bool cmp_str_seq(const char *log, const char *exp) > { > - char needle[80]; > + char needle[200]; > const char *p, *q; > int len; > > do { > + if (!strlen(exp)) > + break; > p = strchr(exp, '\t'); > if (!p) > p = exp + strlen(exp); > @@ -1015,7 +1025,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 +1140,7 @@ 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 || !cmp_str_seq(bpf_vlog, expected_err)) { > printf("FAIL\nUnexpected error message!\n\tEXP: %s\n\tRES: %s\n", > expected_err, bpf_vlog); > goto fail_log; > -- > 2.27.0 >