selftests: bpf: Check bpf_msg_push_data return value
commit 61d06f01f9710b327a53492e5add9f972eb909b3 upstream.
bpf_msg_push_data may return a non-zero value to indicate an error. The
return value should be checked to prevent undetected errors.
To indicate an error, the BPF programs now perform a different action
than their intended one to make the userspace test program notice the
error, i.e., the programs supposed to pass/redirect drop, the program
supposed to drop passes.
Fixes: 84fbfe026a
("bpf: test_sockmap add options to use msg_push_data")
Signed-off-by: Felix Maurer <fmaurer@redhat.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/89f767bb44005d6b4dd1f42038c438f76b3ebfad.1644601294.git.fmaurer@redhat.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
d0caa7218d
commit
4f5d47e6b4
@@ -235,7 +235,7 @@ SEC("sk_msg1")
|
|||||||
int bpf_prog4(struct sk_msg_md *msg)
|
int bpf_prog4(struct sk_msg_md *msg)
|
||||||
{
|
{
|
||||||
int *bytes, zero = 0, one = 1, two = 2, three = 3, four = 4, five = 5;
|
int *bytes, zero = 0, one = 1, two = 2, three = 3, four = 4, five = 5;
|
||||||
int *start, *end, *start_push, *end_push, *start_pop, *pop;
|
int *start, *end, *start_push, *end_push, *start_pop, *pop, err = 0;
|
||||||
|
|
||||||
bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero);
|
bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero);
|
||||||
if (bytes)
|
if (bytes)
|
||||||
@@ -249,8 +249,11 @@ int bpf_prog4(struct sk_msg_md *msg)
|
|||||||
bpf_msg_pull_data(msg, *start, *end, 0);
|
bpf_msg_pull_data(msg, *start, *end, 0);
|
||||||
start_push = bpf_map_lookup_elem(&sock_bytes, &two);
|
start_push = bpf_map_lookup_elem(&sock_bytes, &two);
|
||||||
end_push = bpf_map_lookup_elem(&sock_bytes, &three);
|
end_push = bpf_map_lookup_elem(&sock_bytes, &three);
|
||||||
if (start_push && end_push)
|
if (start_push && end_push) {
|
||||||
bpf_msg_push_data(msg, *start_push, *end_push, 0);
|
err = bpf_msg_push_data(msg, *start_push, *end_push, 0);
|
||||||
|
if (err)
|
||||||
|
return SK_DROP;
|
||||||
|
}
|
||||||
start_pop = bpf_map_lookup_elem(&sock_bytes, &four);
|
start_pop = bpf_map_lookup_elem(&sock_bytes, &four);
|
||||||
pop = bpf_map_lookup_elem(&sock_bytes, &five);
|
pop = bpf_map_lookup_elem(&sock_bytes, &five);
|
||||||
if (start_pop && pop)
|
if (start_pop && pop)
|
||||||
@@ -263,6 +266,7 @@ int bpf_prog6(struct sk_msg_md *msg)
|
|||||||
{
|
{
|
||||||
int zero = 0, one = 1, two = 2, three = 3, four = 4, five = 5, key = 0;
|
int zero = 0, one = 1, two = 2, three = 3, four = 4, five = 5, key = 0;
|
||||||
int *bytes, *start, *end, *start_push, *end_push, *start_pop, *pop, *f;
|
int *bytes, *start, *end, *start_push, *end_push, *start_pop, *pop, *f;
|
||||||
|
int err = 0;
|
||||||
__u64 flags = 0;
|
__u64 flags = 0;
|
||||||
|
|
||||||
bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero);
|
bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero);
|
||||||
@@ -279,8 +283,11 @@ int bpf_prog6(struct sk_msg_md *msg)
|
|||||||
|
|
||||||
start_push = bpf_map_lookup_elem(&sock_bytes, &two);
|
start_push = bpf_map_lookup_elem(&sock_bytes, &two);
|
||||||
end_push = bpf_map_lookup_elem(&sock_bytes, &three);
|
end_push = bpf_map_lookup_elem(&sock_bytes, &three);
|
||||||
if (start_push && end_push)
|
if (start_push && end_push) {
|
||||||
bpf_msg_push_data(msg, *start_push, *end_push, 0);
|
err = bpf_msg_push_data(msg, *start_push, *end_push, 0);
|
||||||
|
if (err)
|
||||||
|
return SK_DROP;
|
||||||
|
}
|
||||||
|
|
||||||
start_pop = bpf_map_lookup_elem(&sock_bytes, &four);
|
start_pop = bpf_map_lookup_elem(&sock_bytes, &four);
|
||||||
pop = bpf_map_lookup_elem(&sock_bytes, &five);
|
pop = bpf_map_lookup_elem(&sock_bytes, &five);
|
||||||
@@ -338,7 +345,7 @@ SEC("sk_msg5")
|
|||||||
int bpf_prog10(struct sk_msg_md *msg)
|
int bpf_prog10(struct sk_msg_md *msg)
|
||||||
{
|
{
|
||||||
int *bytes, *start, *end, *start_push, *end_push, *start_pop, *pop;
|
int *bytes, *start, *end, *start_push, *end_push, *start_pop, *pop;
|
||||||
int zero = 0, one = 1, two = 2, three = 3, four = 4, five = 5;
|
int zero = 0, one = 1, two = 2, three = 3, four = 4, five = 5, err = 0;
|
||||||
|
|
||||||
bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero);
|
bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero);
|
||||||
if (bytes)
|
if (bytes)
|
||||||
@@ -352,8 +359,11 @@ int bpf_prog10(struct sk_msg_md *msg)
|
|||||||
bpf_msg_pull_data(msg, *start, *end, 0);
|
bpf_msg_pull_data(msg, *start, *end, 0);
|
||||||
start_push = bpf_map_lookup_elem(&sock_bytes, &two);
|
start_push = bpf_map_lookup_elem(&sock_bytes, &two);
|
||||||
end_push = bpf_map_lookup_elem(&sock_bytes, &three);
|
end_push = bpf_map_lookup_elem(&sock_bytes, &three);
|
||||||
if (start_push && end_push)
|
if (start_push && end_push) {
|
||||||
bpf_msg_push_data(msg, *start_push, *end_push, 0);
|
err = bpf_msg_push_data(msg, *start_push, *end_push, 0);
|
||||||
|
if (err)
|
||||||
|
return SK_PASS;
|
||||||
|
}
|
||||||
start_pop = bpf_map_lookup_elem(&sock_bytes, &four);
|
start_pop = bpf_map_lookup_elem(&sock_bytes, &four);
|
||||||
pop = bpf_map_lookup_elem(&sock_bytes, &five);
|
pop = bpf_map_lookup_elem(&sock_bytes, &five);
|
||||||
if (start_pop && pop)
|
if (start_pop && pop)
|
||||||
|
Reference in New Issue
Block a user