diff mbox series

[bpf-next] selftests/bpf: don't destroy failed link

Message ID 20200729045056.3363921-1-andriin@fb.com
State Accepted
Delegated to: BPF Maintainers
Headers show
Series [bpf-next] selftests/bpf: don't destroy failed link | expand

Commit Message

Andrii Nakryiko July 29, 2020, 4:50 a.m. UTC
Check that link is NULL or proper pointer before invoking bpf_link__destroy().
Not doing this causes crash in test_progs, when cg_storage_multi selftest
fails.

Cc: YiFei Zhu <zhuyifei@google.com>
Fixes: 3573f384014f ("selftests/bpf: Test CGROUP_STORAGE behavior on shared egress + ingress")
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
---
 .../bpf/prog_tests/cg_storage_multi.c         | 42 ++++++++++++-------
 1 file changed, 28 insertions(+), 14 deletions(-)

Comments

YiFei Zhu July 29, 2020, 5:30 a.m. UTC | #1
On Tue, Jul 28, 2020 at 11:51 PM Andrii Nakryiko <andriin@fb.com> wrote:
>
> Check that link is NULL or proper pointer before invoking bpf_link__destroy().
> Not doing this causes crash in test_progs, when cg_storage_multi selftest
> fails.
>
> Cc: YiFei Zhu <zhuyifei@google.com>
> Fixes: 3573f384014f ("selftests/bpf: Test CGROUP_STORAGE behavior on shared egress + ingress")
> Signed-off-by: Andrii Nakryiko <andriin@fb.com>
> ---
>  .../bpf/prog_tests/cg_storage_multi.c         | 42 ++++++++++++-------
>  1 file changed, 28 insertions(+), 14 deletions(-)
>

Awesome! Thanks for the fix. I did not realize the return was a -errno
rather than NULL like open_and_load.
Song Liu July 29, 2020, 5:47 a.m. UTC | #2
On Tue, Jul 28, 2020 at 9:54 PM Andrii Nakryiko <andriin@fb.com> wrote:
>
> Check that link is NULL or proper pointer before invoking bpf_link__destroy().
> Not doing this causes crash in test_progs, when cg_storage_multi selftest
> fails.
>
> Cc: YiFei Zhu <zhuyifei@google.com>
> Fixes: 3573f384014f ("selftests/bpf: Test CGROUP_STORAGE behavior on shared egress + ingress")
> Signed-off-by: Andrii Nakryiko <andriin@fb.com>

Acked-by: Song Liu <songliubraving@fb.com>

btw: maybe we can move the IS_ERR() check to bpf_link__destroy()?

> ---
>  .../bpf/prog_tests/cg_storage_multi.c         | 42 ++++++++++++-------
>  1 file changed, 28 insertions(+), 14 deletions(-)
>
> diff --git a/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c b/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c
> index c67d8c076a34..643dfa35419c 100644
> --- a/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c
> +++ b/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c
> @@ -147,8 +147,10 @@ static void test_egress_only(int parent_cgroup_fd, int child_cgroup_fd)
>                 goto close_bpf_object;
>
>  close_bpf_object:
> -       bpf_link__destroy(parent_link);
> -       bpf_link__destroy(child_link);
> +       if (!IS_ERR(parent_link))
> +               bpf_link__destroy(parent_link);
> +       if (!IS_ERR(child_link))
> +               bpf_link__destroy(child_link);
>
>         cg_storage_multi_egress_only__destroy(obj);
>  }
> @@ -262,12 +264,18 @@ static void test_isolated(int parent_cgroup_fd, int child_cgroup_fd)
>                 goto close_bpf_object;
>
>  close_bpf_object:
> -       bpf_link__destroy(parent_egress1_link);
> -       bpf_link__destroy(parent_egress2_link);
> -       bpf_link__destroy(parent_ingress_link);
> -       bpf_link__destroy(child_egress1_link);
> -       bpf_link__destroy(child_egress2_link);
> -       bpf_link__destroy(child_ingress_link);
> +       if (!IS_ERR(parent_egress1_link))
> +               bpf_link__destroy(parent_egress1_link);
> +       if (!IS_ERR(parent_egress2_link))
> +               bpf_link__destroy(parent_egress2_link);
> +       if (!IS_ERR(parent_ingress_link))
> +               bpf_link__destroy(parent_ingress_link);
> +       if (!IS_ERR(child_egress1_link))
> +               bpf_link__destroy(child_egress1_link);
> +       if (!IS_ERR(child_egress2_link))
> +               bpf_link__destroy(child_egress2_link);
> +       if (!IS_ERR(child_ingress_link))
> +               bpf_link__destroy(child_ingress_link);
>
>         cg_storage_multi_isolated__destroy(obj);
>  }
> @@ -367,12 +375,18 @@ static void test_shared(int parent_cgroup_fd, int child_cgroup_fd)
>                 goto close_bpf_object;
>
>  close_bpf_object:
> -       bpf_link__destroy(parent_egress1_link);
> -       bpf_link__destroy(parent_egress2_link);
> -       bpf_link__destroy(parent_ingress_link);
> -       bpf_link__destroy(child_egress1_link);
> -       bpf_link__destroy(child_egress2_link);
> -       bpf_link__destroy(child_ingress_link);
> +       if (!IS_ERR(parent_egress1_link))
> +               bpf_link__destroy(parent_egress1_link);
> +       if (!IS_ERR(parent_egress2_link))
> +               bpf_link__destroy(parent_egress2_link);
> +       if (!IS_ERR(parent_ingress_link))
> +               bpf_link__destroy(parent_ingress_link);
> +       if (!IS_ERR(child_egress1_link))
> +               bpf_link__destroy(child_egress1_link);
> +       if (!IS_ERR(child_egress2_link))
> +               bpf_link__destroy(child_egress2_link);
> +       if (!IS_ERR(child_ingress_link))
> +               bpf_link__destroy(child_ingress_link);
>
>         cg_storage_multi_shared__destroy(obj);
>  }
> --
> 2.24.1
>
Andrii Nakryiko July 29, 2020, 6:16 a.m. UTC | #3
On Tue, Jul 28, 2020 at 10:47 PM Song Liu <song@kernel.org> wrote:
>
> On Tue, Jul 28, 2020 at 9:54 PM Andrii Nakryiko <andriin@fb.com> wrote:
> >
> > Check that link is NULL or proper pointer before invoking bpf_link__destroy().
> > Not doing this causes crash in test_progs, when cg_storage_multi selftest
> > fails.
> >
> > Cc: YiFei Zhu <zhuyifei@google.com>
> > Fixes: 3573f384014f ("selftests/bpf: Test CGROUP_STORAGE behavior on shared egress + ingress")
> > Signed-off-by: Andrii Nakryiko <andriin@fb.com>
>
> Acked-by: Song Liu <songliubraving@fb.com>
>
> btw: maybe we can move the IS_ERR() check to bpf_link__destroy()?

Yeah, given how common this mistake seems to be, that wouldn't be a bad idea.

>
> > ---
> >  .../bpf/prog_tests/cg_storage_multi.c         | 42 ++++++++++++-------
> >  1 file changed, 28 insertions(+), 14 deletions(-)
> >

[...]
Daniel Borkmann July 29, 2020, 11:12 p.m. UTC | #4
On 7/29/20 6:50 AM, Andrii Nakryiko wrote:
> Check that link is NULL or proper pointer before invoking bpf_link__destroy().
> Not doing this causes crash in test_progs, when cg_storage_multi selftest
> fails.
> 
> Cc: YiFei Zhu <zhuyifei@google.com>
> Fixes: 3573f384014f ("selftests/bpf: Test CGROUP_STORAGE behavior on shared egress + ingress")
> Signed-off-by: Andrii Nakryiko <andriin@fb.com>

Applied, thanks!
diff mbox series

Patch

diff --git a/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c b/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c
index c67d8c076a34..643dfa35419c 100644
--- a/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c
+++ b/tools/testing/selftests/bpf/prog_tests/cg_storage_multi.c
@@ -147,8 +147,10 @@  static void test_egress_only(int parent_cgroup_fd, int child_cgroup_fd)
 		goto close_bpf_object;
 
 close_bpf_object:
-	bpf_link__destroy(parent_link);
-	bpf_link__destroy(child_link);
+	if (!IS_ERR(parent_link))
+		bpf_link__destroy(parent_link);
+	if (!IS_ERR(child_link))
+		bpf_link__destroy(child_link);
 
 	cg_storage_multi_egress_only__destroy(obj);
 }
@@ -262,12 +264,18 @@  static void test_isolated(int parent_cgroup_fd, int child_cgroup_fd)
 		goto close_bpf_object;
 
 close_bpf_object:
-	bpf_link__destroy(parent_egress1_link);
-	bpf_link__destroy(parent_egress2_link);
-	bpf_link__destroy(parent_ingress_link);
-	bpf_link__destroy(child_egress1_link);
-	bpf_link__destroy(child_egress2_link);
-	bpf_link__destroy(child_ingress_link);
+	if (!IS_ERR(parent_egress1_link))
+		bpf_link__destroy(parent_egress1_link);
+	if (!IS_ERR(parent_egress2_link))
+		bpf_link__destroy(parent_egress2_link);
+	if (!IS_ERR(parent_ingress_link))
+		bpf_link__destroy(parent_ingress_link);
+	if (!IS_ERR(child_egress1_link))
+		bpf_link__destroy(child_egress1_link);
+	if (!IS_ERR(child_egress2_link))
+		bpf_link__destroy(child_egress2_link);
+	if (!IS_ERR(child_ingress_link))
+		bpf_link__destroy(child_ingress_link);
 
 	cg_storage_multi_isolated__destroy(obj);
 }
@@ -367,12 +375,18 @@  static void test_shared(int parent_cgroup_fd, int child_cgroup_fd)
 		goto close_bpf_object;
 
 close_bpf_object:
-	bpf_link__destroy(parent_egress1_link);
-	bpf_link__destroy(parent_egress2_link);
-	bpf_link__destroy(parent_ingress_link);
-	bpf_link__destroy(child_egress1_link);
-	bpf_link__destroy(child_egress2_link);
-	bpf_link__destroy(child_ingress_link);
+	if (!IS_ERR(parent_egress1_link))
+		bpf_link__destroy(parent_egress1_link);
+	if (!IS_ERR(parent_egress2_link))
+		bpf_link__destroy(parent_egress2_link);
+	if (!IS_ERR(parent_ingress_link))
+		bpf_link__destroy(parent_ingress_link);
+	if (!IS_ERR(child_egress1_link))
+		bpf_link__destroy(child_egress1_link);
+	if (!IS_ERR(child_egress2_link))
+		bpf_link__destroy(child_egress2_link);
+	if (!IS_ERR(child_ingress_link))
+		bpf_link__destroy(child_ingress_link);
 
 	cg_storage_multi_shared__destroy(obj);
 }