summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEduard Zingerman <eddyz87@gmail.com>2023-04-07 17:41:25 +0200
committerAndrii Nakryiko <andrii@kernel.org>2023-04-08 00:30:31 +0200
commit5855b0999de4213bf51d856a345c4b53f2304e33 (patch)
tree5f9619d7cfcad0a3db298d7851e4a4920d0926bd
parentbpftool: Set program type only if it differs from the desired one (diff)
downloadlinux-5855b0999de4213bf51d856a345c4b53f2304e33.tar.xz
linux-5855b0999de4213bf51d856a345c4b53f2304e33.zip
selftests/bpf: Prevent infinite loop in veristat when base file is too short
The following example forces veristat to loop indefinitely: $ cat two-ok file_name,prog_name,verdict,total_states file-a,a,success,12 file-b,b,success,67 $ cat add-failure file_name,prog_name,verdict,total_states file-a,a,success,12 file-b,b,success,67 file-b,c,failure,32 $ veristat -C two-ok add-failure <does not return> The loop is caused by handle_comparison_mode() not checking if `base` variable points to `fallback_stats` prior advancing joined results using `base`. Signed-off-by: Eduard Zingerman <eddyz87@gmail.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20230407154125.896927-1-eddyz87@gmail.com
-rw-r--r--tools/testing/selftests/bpf/veristat.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/tools/testing/selftests/bpf/veristat.c b/tools/testing/selftests/bpf/veristat.c
index 53d7ec168268..e05954e20bba 100644
--- a/tools/testing/selftests/bpf/veristat.c
+++ b/tools/testing/selftests/bpf/veristat.c
@@ -1824,18 +1824,22 @@ static int handle_comparison_mode(void)
join->stats_b = comp;
i++;
j++;
- } else if (comp == &fallback_stats || r < 0) {
+ } else if (base != &fallback_stats && (comp == &fallback_stats || r < 0)) {
join->file_name = base->file_name;
join->prog_name = base->prog_name;
join->stats_a = base;
join->stats_b = NULL;
i++;
- } else {
+ } else if (comp != &fallback_stats && (base == &fallback_stats || r > 0)) {
join->file_name = comp->file_name;
join->prog_name = comp->prog_name;
join->stats_a = NULL;
join->stats_b = comp;
j++;
+ } else {
+ fprintf(stderr, "%s:%d: should never reach here i=%i, j=%i",
+ __FILE__, __LINE__, i, j);
+ return -EINVAL;
}
env.join_stat_cnt += 1;
}