Skip to content

Commit 71dca29

Browse files
theihorAlexei Starovoitov
authored andcommitted
selftests/bpf: Fix resource leaks caused by missing cleanups
ASAN reported a number of resource leaks: - Add missing *__destroy(skel) calls - Replace bpf_link__detach() with bpf_link__destroy() where appropriate - cgrp_local_storage: Add bpf_link__destroy() when bpf_iter_create fails - dynptr: Add missing bpf_object__close() Acked-by: Eduard Zingerman <eddyz87@gmail.com> Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev> Link: https://lore.kernel.org/r/20260223190736.649171-16-ihor.solodrai@linux.dev Signed-off-by: Alexei Starovoitov <ast@kernel.org>
1 parent 68b8bea commit 71dca29

7 files changed

Lines changed: 29 additions & 25 deletions

File tree

tools/testing/selftests/bpf/prog_tests/cgrp_local_storage.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,14 +202,16 @@ static void test_cgroup_iter_sleepable(int cgroup_fd, __u64 cgroup_id)
202202

203203
iter_fd = bpf_iter_create(bpf_link__fd(link));
204204
if (!ASSERT_GE(iter_fd, 0, "iter_create"))
205-
goto out;
205+
goto out_link;
206206

207207
/* trigger the program run */
208208
(void)read(iter_fd, buf, sizeof(buf));
209209

210210
ASSERT_EQ(skel->bss->cgroup_id, cgroup_id, "cgroup_id");
211211

212212
close(iter_fd);
213+
out_link:
214+
bpf_link__destroy(link);
213215
out:
214216
cgrp_ls_sleepable__destroy(skel);
215217
}

tools/testing/selftests/bpf/prog_tests/dynptr.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,14 @@ static void verify_success(const char *prog_name, enum test_setup_type setup_typ
137137
);
138138

139139
link = bpf_program__attach(prog);
140-
if (!ASSERT_OK_PTR(link, "bpf_program__attach"))
140+
if (!ASSERT_OK_PTR(link, "bpf_program__attach")) {
141+
bpf_object__close(obj);
141142
goto cleanup;
143+
}
142144

143145
err = bpf_prog_test_run_opts(aux_prog_fd, &topts);
144146
bpf_link__destroy(link);
147+
bpf_object__close(obj);
145148

146149
if (!ASSERT_OK(err, "test_run"))
147150
goto cleanup;

tools/testing/selftests/bpf/prog_tests/sockmap_basic.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ static void test_skmsg_helpers_with_link(enum bpf_map_type map_type)
204204
/* Fail since bpf_link for the same prog type has been created. */
205205
link2 = bpf_program__attach_sockmap(prog_clone, map);
206206
if (!ASSERT_ERR_PTR(link2, "bpf_program__attach_sockmap")) {
207-
bpf_link__detach(link2);
207+
bpf_link__destroy(link2);
208208
goto out;
209209
}
210210

@@ -230,7 +230,7 @@ static void test_skmsg_helpers_with_link(enum bpf_map_type map_type)
230230
if (!ASSERT_OK(err, "bpf_link_update"))
231231
goto out;
232232
out:
233-
bpf_link__detach(link);
233+
bpf_link__destroy(link);
234234
test_skmsg_load_helpers__destroy(skel);
235235
}
236236

@@ -417,7 +417,7 @@ static void test_sockmap_skb_verdict_attach_with_link(void)
417417
if (!ASSERT_OK_PTR(link, "bpf_program__attach_sockmap"))
418418
goto out;
419419

420-
bpf_link__detach(link);
420+
bpf_link__destroy(link);
421421

422422
err = bpf_prog_attach(bpf_program__fd(prog), map, BPF_SK_SKB_STREAM_VERDICT, 0);
423423
if (!ASSERT_OK(err, "bpf_prog_attach"))
@@ -426,7 +426,7 @@ static void test_sockmap_skb_verdict_attach_with_link(void)
426426
/* Fail since attaching with the same prog/map has been done. */
427427
link = bpf_program__attach_sockmap(prog, map);
428428
if (!ASSERT_ERR_PTR(link, "bpf_program__attach_sockmap"))
429-
bpf_link__detach(link);
429+
bpf_link__destroy(link);
430430

431431
err = bpf_prog_detach2(bpf_program__fd(prog), map, BPF_SK_SKB_STREAM_VERDICT);
432432
if (!ASSERT_OK(err, "bpf_prog_detach2"))
@@ -747,13 +747,13 @@ static void test_sockmap_skb_verdict_peek_with_link(void)
747747
test_sockmap_skb_verdict_peek_helper(map);
748748
ASSERT_EQ(pass->bss->clone_called, 1, "clone_called");
749749
out:
750-
bpf_link__detach(link);
750+
bpf_link__destroy(link);
751751
test_sockmap_pass_prog__destroy(pass);
752752
}
753753

754754
static void test_sockmap_unconnected_unix(void)
755755
{
756-
int err, map, stream = 0, dgram = 0, zero = 0;
756+
int err, map, stream = -1, dgram = -1, zero = 0;
757757
struct test_sockmap_pass_prog *skel;
758758

759759
skel = test_sockmap_pass_prog__open_and_load();
@@ -764,22 +764,22 @@ static void test_sockmap_unconnected_unix(void)
764764

765765
stream = xsocket(AF_UNIX, SOCK_STREAM, 0);
766766
if (stream < 0)
767-
return;
767+
goto out;
768768

769769
dgram = xsocket(AF_UNIX, SOCK_DGRAM, 0);
770-
if (dgram < 0) {
771-
close(stream);
772-
return;
773-
}
770+
if (dgram < 0)
771+
goto out;
774772

775773
err = bpf_map_update_elem(map, &zero, &stream, BPF_ANY);
776-
ASSERT_ERR(err, "bpf_map_update_elem(stream)");
774+
if (!ASSERT_ERR(err, "bpf_map_update_elem(stream)"))
775+
goto out;
777776

778777
err = bpf_map_update_elem(map, &zero, &dgram, BPF_ANY);
779778
ASSERT_OK(err, "bpf_map_update_elem(dgram)");
780-
779+
out:
781780
close(stream);
782781
close(dgram);
782+
test_sockmap_pass_prog__destroy(skel);
783783
}
784784

785785
static void test_sockmap_many_socket(void)
@@ -1027,7 +1027,7 @@ static void test_sockmap_skb_verdict_vsock_poll(void)
10271027
if (xrecv_nonblock(conn, &buf, 1, 0) != 1)
10281028
FAIL("xrecv_nonblock");
10291029
detach:
1030-
bpf_link__detach(link);
1030+
bpf_link__destroy(link);
10311031
close:
10321032
xclose(conn);
10331033
xclose(peer);

tools/testing/selftests/bpf/prog_tests/sockmap_listen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,7 @@ static void test_msg_redir_to_listening_with_link(struct test_sockmap_listen *sk
899899

900900
redir_to_listening(family, sotype, sock_map, verdict_map, REDIR_EGRESS);
901901

902-
bpf_link__detach(link);
902+
bpf_link__destroy(link);
903903
}
904904

905905
static void redir_partial(int family, int sotype, int sock_map, int parser_map)

tools/testing/selftests/bpf/prog_tests/struct_ops_private_stack.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,7 @@ static void test_private_stack_fail(void)
5454
}
5555

5656
err = struct_ops_private_stack_fail__load(skel);
57-
if (!ASSERT_ERR(err, "struct_ops_private_stack_fail__load"))
58-
goto cleanup;
59-
return;
57+
ASSERT_ERR(err, "struct_ops_private_stack_fail__load");
6058

6159
cleanup:
6260
struct_ops_private_stack_fail__destroy(skel);

tools/testing/selftests/bpf/prog_tests/tc_opts.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,10 +1360,8 @@ static void test_tc_opts_dev_cleanup_target(int target)
13601360

13611361
assert_mprog_count_ifindex(ifindex, target, 4);
13621362

1363-
ASSERT_OK(system("ip link del dev tcx_opts1"), "del veth");
1364-
ASSERT_EQ(if_nametoindex("tcx_opts1"), 0, "dev1_removed");
1365-
ASSERT_EQ(if_nametoindex("tcx_opts2"), 0, "dev2_removed");
1366-
return;
1363+
goto cleanup;
1364+
13671365
cleanup3:
13681366
err = bpf_prog_detach_opts(fd3, loopback, target, &optd);
13691367
ASSERT_OK(err, "prog_detach");

tools/testing/selftests/bpf/prog_tests/test_tc_tunnel.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ void test_tc_tunnel(void)
699699
return;
700700

701701
if (!ASSERT_OK(setup(), "global setup"))
702-
return;
702+
goto out;
703703

704704
for (i = 0; i < ARRAY_SIZE(subtests_cfg); i++) {
705705
cfg = &subtests_cfg[i];
@@ -711,4 +711,7 @@ void test_tc_tunnel(void)
711711
subtest_cleanup(cfg);
712712
}
713713
cleanup();
714+
715+
out:
716+
test_tc_tunnel__destroy(skel);
714717
}

0 commit comments

Comments
 (0)