@@ -163,26 +163,49 @@ static void verif_log_subtest(const char *name, bool expect_load_error, int log_
opts.log_buf = logs.buf;
opts.log_level = log_level | 8; /* BPF_LOG_FIXED */
opts.log_size = sizeof(logs.buf);
+ opts.log_size_actual = 0;
res = load_prog(&opts, expect_load_error);
ASSERT_NEQ(res, -ENOSPC, "prog_load_res_fixed");
log_sz_actual_fixed = opts.log_size_actual;
ASSERT_GT(log_sz_actual_fixed, 0, "log_sz_actual_fixed");
+ /* (FIXED, NULL) get actual log size */
+ opts.log_buf = NULL;
+ opts.log_level = log_level | 8; /* BPF_LOG_FIXED */
+ opts.log_size = 0;
+ opts.log_size_actual = 0;
+ res = load_prog(&opts, true /* should fail */);
+ ASSERT_EQ(res, -ENOSPC, "prog_load_res_fixed_null");
+ ASSERT_EQ(opts.log_size_actual, log_sz_actual_fixed, "log_sz_fixed_null_eq");
+ printf("FIXED ACTUAL %u\n", opts.log_size_actual);
+
/* (ROLLING) get actual log size */
opts.log_buf = logs.buf;
opts.log_level = log_level;
opts.log_size = sizeof(logs.buf);
+ opts.log_size_actual = 0;
res = load_prog(&opts, expect_load_error);
ASSERT_NEQ(res, -ENOSPC, "prog_load_res_rolling");
log_sz_actual_rolling = opts.log_size_actual;
ASSERT_EQ(log_sz_actual_rolling, log_sz_actual_fixed, "log_sz_actual_eq");
+ /* (ROLLING, NULL) get actual log size */
+ opts.log_buf = NULL;
+ opts.log_level = log_level;
+ opts.log_size = 0;
+ opts.log_size_actual = 0;
+ res = load_prog(&opts, true /* should fail */);
+ ASSERT_EQ(res, -ENOSPC, "prog_load_res_rolling_null");
+ ASSERT_EQ(opts.log_size_actual, log_sz_actual_rolling, "log_sz_actual_null_eq");
+ printf("ROLLING ACTUAL %u\n", opts.log_size_actual);
+
/* (FIXED) expect -ENOSPC for one byte short log */
opts.log_buf = logs.buf;
opts.log_level = log_level | 8; /* BPF_LOG_FIXED */
opts.log_size = log_sz_actual_fixed - 1;
+ opts.log_size_actual = 0;
res = load_prog(&opts, true /* should fail */);
ASSERT_EQ(res, -ENOSPC, "prog_load_res_too_short_fixed");
@@ -190,6 +213,7 @@ static void verif_log_subtest(const char *name, bool expect_load_error, int log_
opts.log_buf = logs.buf;
opts.log_level = log_level | 8; /* BPF_LOG_FIXED */
opts.log_size = log_sz_actual_fixed;
+ opts.log_size_actual = 0;
res = load_prog(&opts, expect_load_error);
ASSERT_NEQ(res, -ENOSPC, "prog_load_res_just_right_fixed");
@@ -204,6 +228,7 @@ static void verif_log_subtest(const char *name, bool expect_load_error, int log_
opts.log_buf = logs.buf;
opts.log_level = log_level;
opts.log_size = log_sz_actual_rolling;
+ opts.log_size_actual = 0;
res = load_prog(&opts, expect_load_error);
ASSERT_NEQ(res, -ENOSPC, "prog_load_res_just_right_rolling");
Add few extra test conditions to validate that it's ok to pass log_buf==NULL and log_size==0 to BPF_PROG_LOAD command with the intent to get log_size_actual without providing a buffer. Signed-off-by: Andrii Nakryiko <andrii@kernel.org> --- .../selftests/bpf/prog_tests/verifier_log.c | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+)