Commit 0b6b8a3d authored by Daniel Borkmann's avatar Daniel Borkmann

Merge branch 'bpf-misc-selftest-improvements'

Joe Stringer says:

====================
This is series makes some minor changes primarily focused on making it easier
to understand why test_verifier is failing a test. This includes printing the
observed output when a test fails in a different way than expected, or when
unprivileged tests fail due to sysctl kernel.unprivileged_bpf_disabled=1. The
last patch removes some apparently dead code.
====================
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parents 615a9474 544bdebc
...@@ -508,10 +508,6 @@ static struct bpf_verifier_state *push_stack(struct bpf_verifier_env *env, ...@@ -508,10 +508,6 @@ static struct bpf_verifier_state *push_stack(struct bpf_verifier_env *env,
static const int caller_saved[CALLER_SAVED_REGS] = { static const int caller_saved[CALLER_SAVED_REGS] = {
BPF_REG_0, BPF_REG_1, BPF_REG_2, BPF_REG_3, BPF_REG_4, BPF_REG_5 BPF_REG_0, BPF_REG_1, BPF_REG_2, BPF_REG_3, BPF_REG_4, BPF_REG_5
}; };
#define CALLEE_SAVED_REGS 5
static const int callee_saved[CALLEE_SAVED_REGS] = {
BPF_REG_6, BPF_REG_7, BPF_REG_8, BPF_REG_9
};
static void __mark_reg_not_init(struct bpf_reg_state *reg); static void __mark_reg_not_init(struct bpf_reg_state *reg);
......
...@@ -57,6 +57,9 @@ ...@@ -57,6 +57,9 @@
#define F_NEEDS_EFFICIENT_UNALIGNED_ACCESS (1 << 0) #define F_NEEDS_EFFICIENT_UNALIGNED_ACCESS (1 << 0)
#define F_LOAD_WITH_STRICT_ALIGNMENT (1 << 1) #define F_LOAD_WITH_STRICT_ALIGNMENT (1 << 1)
#define UNPRIV_SYSCTL "kernel/unprivileged_bpf_disabled"
static bool unpriv_disabled = false;
struct bpf_test { struct bpf_test {
const char *descr; const char *descr;
struct bpf_insn insns[MAX_INSNS]; struct bpf_insn insns[MAX_INSNS];
...@@ -11291,7 +11294,8 @@ static void do_test_single(struct bpf_test *test, bool unpriv, ...@@ -11291,7 +11294,8 @@ static void do_test_single(struct bpf_test *test, bool unpriv,
goto fail_log; goto fail_log;
} }
if (!strstr(bpf_vlog, expected_err) && !reject_from_alignment) { if (!strstr(bpf_vlog, expected_err) && !reject_from_alignment) {
printf("FAIL\nUnexpected error message!\n"); printf("FAIL\nUnexpected error message!\n\tEXP: %s\n\tRES: %s\n",
expected_err, bpf_vlog);
goto fail_log; goto fail_log;
} }
} }
...@@ -11375,9 +11379,20 @@ static int set_admin(bool admin) ...@@ -11375,9 +11379,20 @@ static int set_admin(bool admin)
return ret; return ret;
} }
static void get_unpriv_disabled()
{
char buf[2];
FILE *fd;
fd = fopen("/proc/sys/"UNPRIV_SYSCTL, "r");
if (fgets(buf, 2, fd) == buf && atoi(buf))
unpriv_disabled = true;
fclose(fd);
}
static int do_test(bool unpriv, unsigned int from, unsigned int to) static int do_test(bool unpriv, unsigned int from, unsigned int to)
{ {
int i, passes = 0, errors = 0; int i, passes = 0, errors = 0, skips = 0;
for (i = from; i < to; i++) { for (i = from; i < to; i++) {
struct bpf_test *test = &tests[i]; struct bpf_test *test = &tests[i];
...@@ -11385,7 +11400,10 @@ static int do_test(bool unpriv, unsigned int from, unsigned int to) ...@@ -11385,7 +11400,10 @@ static int do_test(bool unpriv, unsigned int from, unsigned int to)
/* Program types that are not supported by non-root we /* Program types that are not supported by non-root we
* skip right away. * skip right away.
*/ */
if (!test->prog_type) { if (!test->prog_type && unpriv_disabled) {
printf("#%d/u %s SKIP\n", i, test->descr);
skips++;
} else if (!test->prog_type) {
if (!unpriv) if (!unpriv)
set_admin(false); set_admin(false);
printf("#%d/u %s ", i, test->descr); printf("#%d/u %s ", i, test->descr);
...@@ -11394,13 +11412,17 @@ static int do_test(bool unpriv, unsigned int from, unsigned int to) ...@@ -11394,13 +11412,17 @@ static int do_test(bool unpriv, unsigned int from, unsigned int to)
set_admin(true); set_admin(true);
} }
if (!unpriv) { if (unpriv) {
printf("#%d/p %s SKIP\n", i, test->descr);
skips++;
} else {
printf("#%d/p %s ", i, test->descr); printf("#%d/p %s ", i, test->descr);
do_test_single(test, false, &passes, &errors); do_test_single(test, false, &passes, &errors);
} }
} }
printf("Summary: %d PASSED, %d FAILED\n", passes, errors); printf("Summary: %d PASSED, %d SKIPPED, %d FAILED\n", passes,
skips, errors);
return errors ? EXIT_FAILURE : EXIT_SUCCESS; return errors ? EXIT_FAILURE : EXIT_SUCCESS;
} }
...@@ -11428,6 +11450,13 @@ int main(int argc, char **argv) ...@@ -11428,6 +11450,13 @@ int main(int argc, char **argv)
} }
} }
get_unpriv_disabled();
if (unpriv && unpriv_disabled) {
printf("Cannot run as unprivileged user with sysctl %s.\n",
UNPRIV_SYSCTL);
return EXIT_FAILURE;
}
setrlimit(RLIMIT_MEMLOCK, unpriv ? &rlim : &rinf); setrlimit(RLIMIT_MEMLOCK, unpriv ? &rlim : &rinf);
return do_test(unpriv, from, to); return do_test(unpriv, from, to);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment