selftests/bpf: Add variable-length data concat pattern less than test
Extend original variable-length tests with a case to catch a common existing pattern of testing for < 0 for errors. Note because verifier also tracks upper bounds and we know it can not be greater than MAX_LEN here we can skip upper bound check. In ALU64 enabled compilation converting from long->int return types in probe helpers results in extra instruction pattern, <<= 32, s >>= 32. The trade-off is the non-ALU64 case works. If you really care about every extra insn (XDP case?) then you probably should be using original int type. In addition adding a sext insn to bpf might help the verifier in the general case to avoid these types of tricks. Signed-off-by: John Fastabend <john.fastabend@gmail.com> Signed-off-by: Andrii Nakryiko <andriin@fb.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20200623032224.4020118-3-andriin@fb.com
This commit is contained in:
parent
5e85c6bb8e
commit
2fde1747c9
|
@ -51,6 +51,18 @@ void test_varlen(void)
|
|||
CHECK_VAL(data->total2, size1 + size2);
|
||||
CHECK(memcmp(data->payload2, exp_str, size1 + size2), "content_check",
|
||||
"doesn't match!");
|
||||
|
||||
CHECK_VAL(data->payload3_len1, size1);
|
||||
CHECK_VAL(data->payload3_len2, size2);
|
||||
CHECK_VAL(data->total3, size1 + size2);
|
||||
CHECK(memcmp(data->payload3, exp_str, size1 + size2), "content_check",
|
||||
"doesn't match!");
|
||||
|
||||
CHECK_VAL(data->payload4_len1, size1);
|
||||
CHECK_VAL(data->payload4_len2, size2);
|
||||
CHECK_VAL(data->total4, size1 + size2);
|
||||
CHECK(memcmp(data->payload4, exp_str, size1 + size2), "content_check",
|
||||
"doesn't match!");
|
||||
cleanup:
|
||||
test_varlen__destroy(skel);
|
||||
}
|
||||
|
|
|
@ -26,8 +26,18 @@ int payload2_len2 = -1;
|
|||
int total2 = -1;
|
||||
char payload2[MAX_LEN + MAX_LEN] = { 1 };
|
||||
|
||||
int payload3_len1 = -1;
|
||||
int payload3_len2 = -1;
|
||||
int total3= -1;
|
||||
char payload3[MAX_LEN + MAX_LEN] = { 1 };
|
||||
|
||||
int payload4_len1 = -1;
|
||||
int payload4_len2 = -1;
|
||||
int total4= -1;
|
||||
char payload4[MAX_LEN + MAX_LEN] = { 1 };
|
||||
|
||||
SEC("raw_tp/sys_enter")
|
||||
int handler64(void *regs)
|
||||
int handler64_unsigned(void *regs)
|
||||
{
|
||||
int pid = bpf_get_current_pid_tgid() >> 32;
|
||||
void *payload = payload1;
|
||||
|
@ -54,8 +64,34 @@ int handler64(void *regs)
|
|||
return 0;
|
||||
}
|
||||
|
||||
SEC("tp_btf/sys_enter")
|
||||
int handler32(void *regs)
|
||||
SEC("raw_tp/sys_exit")
|
||||
int handler64_signed(void *regs)
|
||||
{
|
||||
int pid = bpf_get_current_pid_tgid() >> 32;
|
||||
void *payload = payload3;
|
||||
long len;
|
||||
|
||||
/* ignore irrelevant invocations */
|
||||
if (test_pid != pid || !capture)
|
||||
return 0;
|
||||
|
||||
len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in1[0]);
|
||||
if (len >= 0) {
|
||||
payload += len;
|
||||
payload3_len1 = len;
|
||||
}
|
||||
len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in2[0]);
|
||||
if (len >= 0) {
|
||||
payload += len;
|
||||
payload3_len2 = len;
|
||||
}
|
||||
total3 = payload - (void *)payload3;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("tp/raw_syscalls/sys_enter")
|
||||
int handler32_unsigned(void *regs)
|
||||
{
|
||||
int pid = bpf_get_current_pid_tgid() >> 32;
|
||||
void *payload = payload2;
|
||||
|
@ -82,7 +118,33 @@ int handler32(void *regs)
|
|||
return 0;
|
||||
}
|
||||
|
||||
SEC("tp_btf/sys_exit")
|
||||
SEC("tp/raw_syscalls/sys_exit")
|
||||
int handler32_signed(void *regs)
|
||||
{
|
||||
int pid = bpf_get_current_pid_tgid() >> 32;
|
||||
void *payload = payload4;
|
||||
int len;
|
||||
|
||||
/* ignore irrelevant invocations */
|
||||
if (test_pid != pid || !capture)
|
||||
return 0;
|
||||
|
||||
len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in1[0]);
|
||||
if (len >= 0) {
|
||||
payload += len;
|
||||
payload4_len1 = len;
|
||||
}
|
||||
len = bpf_probe_read_kernel_str(payload, MAX_LEN, &buf_in2[0]);
|
||||
if (len >= 0) {
|
||||
payload += len;
|
||||
payload4_len2 = len;
|
||||
}
|
||||
total4 = payload - (void *)payload4;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
SEC("tp/syscalls/sys_exit_getpid")
|
||||
int handler_exit(void *regs)
|
||||
{
|
||||
long bla;
|
||||
|
|
Loading…
Reference in New Issue