[PATCH] selftests/bpf: close the file descriptor to avoid resource leaks

Malaya Kumar Rout posted 1 patch 8 months, 4 weeks ago
tools/testing/selftests/bpf/benchs/bench_htab_mem.c | 1 +
tools/testing/selftests/bpf/prog_tests/sk_assign.c  | 4 +++-
2 files changed, 4 insertions(+), 1 deletion(-)
[PATCH] selftests/bpf: close the file descriptor to avoid resource leaks
Posted by Malaya Kumar Rout 8 months, 4 weeks ago
Static Analyis for bench_htab_mem.c with cppcheck:error
tools/testing/selftests/bpf/benchs/bench_htab_mem.c:284:3:
error: Resource leak: fd [resourceLeak]
tools/testing/selftests/bpf/prog_tests/sk_assign.c:41:3:
error: Resource leak: tc [resourceLeak]

fix the issue  by closing the file descriptor (fd & tc) when
read & fgets operation fails.

Signed-off-by: Malaya Kumar Rout <malayarout91@gmail.com>
---
 tools/testing/selftests/bpf/benchs/bench_htab_mem.c | 1 +
 tools/testing/selftests/bpf/prog_tests/sk_assign.c  | 4 +++-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
index 926ee822143e..59746fd2c23a 100644
--- a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
+++ b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
@@ -281,6 +281,7 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
 	got = read(fd, buf, sizeof(buf) - 1);
 	if (got <= 0) {
 		*value = 0;
+		close(fd);
 		return;
 	}
 	buf[got] = 0;
diff --git a/tools/testing/selftests/bpf/prog_tests/sk_assign.c b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
index 0b9bd1d6f7cc..10a0ab954b8a 100644
--- a/tools/testing/selftests/bpf/prog_tests/sk_assign.c
+++ b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
@@ -37,8 +37,10 @@ configure_stack(void)
 	tc = popen("tc -V", "r");
 	if (CHECK_FAIL(!tc))
 		return false;
-	if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc)))
+	if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc))) {
+		pclose(tc);
 		return false;
+	}
 	if (strstr(tc_version, ", libbpf "))
 		prog = "test_sk_assign_libbpf.bpf.o";
 	else
-- 
2.43.0
Re: [PATCH] selftests/bpf: close the file descriptor to avoid resource leaks
Posted by Andrii Nakryiko 8 months, 2 weeks ago
On Sun, Mar 23, 2025 at 11:43 PM Malaya Kumar Rout
<malayarout91@gmail.com> wrote:
>
> Static Analyis for bench_htab_mem.c with cppcheck:error
> tools/testing/selftests/bpf/benchs/bench_htab_mem.c:284:3:
> error: Resource leak: fd [resourceLeak]
> tools/testing/selftests/bpf/prog_tests/sk_assign.c:41:3:
> error: Resource leak: tc [resourceLeak]
>
> fix the issue  by closing the file descriptor (fd & tc) when
> read & fgets operation fails.
>
> Signed-off-by: Malaya Kumar Rout <malayarout91@gmail.com>
> ---
>  tools/testing/selftests/bpf/benchs/bench_htab_mem.c | 1 +
>  tools/testing/selftests/bpf/prog_tests/sk_assign.c  | 4 +++-
>  2 files changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> index 926ee822143e..59746fd2c23a 100644
> --- a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> +++ b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> @@ -281,6 +281,7 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
>         got = read(fd, buf, sizeof(buf) - 1);

It could be a bit cleaner to add close(fd) here and drop the one we
have at the end of the function.

pw-bot: cr

>         if (got <= 0) {
>                 *value = 0;
> +               close(fd);
>                 return;
>         }
>         buf[got] = 0;
> diff --git a/tools/testing/selftests/bpf/prog_tests/sk_assign.c b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> index 0b9bd1d6f7cc..10a0ab954b8a 100644
> --- a/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> +++ b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> @@ -37,8 +37,10 @@ configure_stack(void)
>         tc = popen("tc -V", "r");
>         if (CHECK_FAIL(!tc))
>                 return false;
> -       if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc)))
> +       if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc))) {
> +               pclose(tc);

this one looks good

>                 return false;
> +       }
>         if (strstr(tc_version, ", libbpf "))
>                 prog = "test_sk_assign_libbpf.bpf.o";
>         else
> --
> 2.43.0
>
Re: [PATCH] selftests/bpf: close the file descriptor to avoid resource leaks
Posted by malaya kumar rout 8 months, 2 weeks ago
On Fri, Apr 4, 2025 at 9:22 PM Andrii Nakryiko
<andrii.nakryiko@gmail.com> wrote:
>
> On Sun, Mar 23, 2025 at 11:43 PM Malaya Kumar Rout
> <malayarout91@gmail.com> wrote:
> >
> > Static Analyis for bench_htab_mem.c with cppcheck:error
> > tools/testing/selftests/bpf/benchs/bench_htab_mem.c:284:3:
> > error: Resource leak: fd [resourceLeak]
> > tools/testing/selftests/bpf/prog_tests/sk_assign.c:41:3:
> > error: Resource leak: tc [resourceLeak]
> >
> > fix the issue  by closing the file descriptor (fd & tc) when
> > read & fgets operation fails.
> >
> > Signed-off-by: Malaya Kumar Rout <malayarout91@gmail.com>
> > ---
> >  tools/testing/selftests/bpf/benchs/bench_htab_mem.c | 1 +
> >  tools/testing/selftests/bpf/prog_tests/sk_assign.c  | 4 +++-
> >  2 files changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> > index 926ee822143e..59746fd2c23a 100644
> > --- a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> > +++ b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> > @@ -281,6 +281,7 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
> >         got = read(fd, buf, sizeof(buf) - 1);
>
> It could be a bit cleaner to add close(fd) here and drop the one we
> have at the end of the function.
>
Here, close(fd)  is now positioned within the error handling block,
guaranteeing that
the file descriptor will be closed prior to returning from the
function in the event of a read error.
Meanwhile, the final close(fd) at the end of the function is retained
for successful execution,
thereby avoiding any potential resource leaks.
Hence, It is essential to add the close(fd) in both locations to
prevent resource leakage.

> pw-bot: cr
>
> >         if (got <= 0) {
> >                 *value = 0;
> > +               close(fd);
> >                 return;
> >         }
> >         buf[got] = 0;
> > diff --git a/tools/testing/selftests/bpf/prog_tests/sk_assign.c b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> > index 0b9bd1d6f7cc..10a0ab954b8a 100644
> > --- a/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> > +++ b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> > @@ -37,8 +37,10 @@ configure_stack(void)
> >         tc = popen("tc -V", "r");
> >         if (CHECK_FAIL(!tc))
> >                 return false;
> > -       if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc)))
> > +       if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc))) {
> > +               pclose(tc);
>
> this one looks good
>
> >                 return false;
> > +       }
> >         if (strstr(tc_version, ", libbpf "))
> >                 prog = "test_sk_assign_libbpf.bpf.o";
> >         else
> > --
> > 2.43.0
> >
Re: [PATCH] selftests/bpf: close the file descriptor to avoid resource leaks
Posted by Hou Tao 8 months, 2 weeks ago
Hi,

On 4/5/2025 1:59 PM, malaya kumar rout wrote:
> On Fri, Apr 4, 2025 at 9:22 PM Andrii Nakryiko
> <andrii.nakryiko@gmail.com> wrote:
>> On Sun, Mar 23, 2025 at 11:43 PM Malaya Kumar Rout
>> <malayarout91@gmail.com> wrote:
>>> Static Analyis for bench_htab_mem.c with cppcheck:error
>>> tools/testing/selftests/bpf/benchs/bench_htab_mem.c:284:3:
>>> error: Resource leak: fd [resourceLeak]
>>> tools/testing/selftests/bpf/prog_tests/sk_assign.c:41:3:
>>> error: Resource leak: tc [resourceLeak]
>>>
>>> fix the issue  by closing the file descriptor (fd & tc) when
>>> read & fgets operation fails.
>>>
>>> Signed-off-by: Malaya Kumar Rout <malayarout91@gmail.com>
>>> ---
>>>  tools/testing/selftests/bpf/benchs/bench_htab_mem.c | 1 +
>>>  tools/testing/selftests/bpf/prog_tests/sk_assign.c  | 4 +++-
>>>  2 files changed, 4 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
>>> index 926ee822143e..59746fd2c23a 100644
>>> --- a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
>>> +++ b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
>>> @@ -281,6 +281,7 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
>>>         got = read(fd, buf, sizeof(buf) - 1);
>> It could be a bit cleaner to add close(fd) here and drop the one we
>> have at the end of the function.
>>
> Here, close(fd)  is now positioned within the error handling block,
> guaranteeing that
> the file descriptor will be closed prior to returning from the
> function in the event of a read error.
> Meanwhile, the final close(fd) at the end of the function is retained
> for successful execution,
> thereby avoiding any potential resource leaks.
> Hence, It is essential to add the close(fd) in both locations to
> prevent resource leakage.

I think Andrii was proposing the following solution:

{
        /* ...... */
        got = read(fd, buf, sizeof(buf) - 1);
        close(fd);
        if (got <= 0) {
                *value = 0;
                return;
        }
        buf[got] = 0;

        *value = strtoull(buf, NULL, 0);
}

It only invokes close(fd) once to handle both the failed case and the
successful case.
>
>> pw-bot: cr
>>
>>>         if (got <= 0) {
>>>                 *value = 0;
>>> +               close(fd);
>>>                 return;
>>>         }
>>>         buf[got] = 0;
>>> diff --git a/tools/testing/selftests/bpf/prog_tests/sk_assign.c b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
>>> index 0b9bd1d6f7cc..10a0ab954b8a 100644
>>> --- a/tools/testing/selftests/bpf/prog_tests/sk_assign.c
>>> +++ b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
>>> @@ -37,8 +37,10 @@ configure_stack(void)
>>>         tc = popen("tc -V", "r");
>>>         if (CHECK_FAIL(!tc))
>>>                 return false;
>>> -       if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc)))
>>> +       if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc))) {
>>> +               pclose(tc);
>> this one looks good
>>
>>>                 return false;
>>> +       }
>>>         if (strstr(tc_version, ", libbpf "))
>>>                 prog = "test_sk_assign_libbpf.bpf.o";
>>>         else
>>> --
>>> 2.43.0
>>>
> .

Re: [PATCH] selftests/bpf: close the file descriptor to avoid resource leaks
Posted by malaya kumar rout 8 months, 2 weeks ago
On Mon, Apr 7, 2025 at 7:07 AM Hou Tao <houtao@huaweicloud.com> wrote:
>
> Hi,
>
> On 4/5/2025 1:59 PM, malaya kumar rout wrote:
> > On Fri, Apr 4, 2025 at 9:22 PM Andrii Nakryiko
> > <andrii.nakryiko@gmail.com> wrote:
> >> On Sun, Mar 23, 2025 at 11:43 PM Malaya Kumar Rout
> >> <malayarout91@gmail.com> wrote:
> >>> Static Analyis for bench_htab_mem.c with cppcheck:error
> >>> tools/testing/selftests/bpf/benchs/bench_htab_mem.c:284:3:
> >>> error: Resource leak: fd [resourceLeak]
> >>> tools/testing/selftests/bpf/prog_tests/sk_assign.c:41:3:
> >>> error: Resource leak: tc [resourceLeak]
> >>>
> >>> fix the issue  by closing the file descriptor (fd & tc) when
> >>> read & fgets operation fails.
> >>>
> >>> Signed-off-by: Malaya Kumar Rout <malayarout91@gmail.com>
> >>> ---
> >>>  tools/testing/selftests/bpf/benchs/bench_htab_mem.c | 1 +
> >>>  tools/testing/selftests/bpf/prog_tests/sk_assign.c  | 4 +++-
> >>>  2 files changed, 4 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> >>> index 926ee822143e..59746fd2c23a 100644
> >>> --- a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> >>> +++ b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> >>> @@ -281,6 +281,7 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
> >>>         got = read(fd, buf, sizeof(buf) - 1);
> >> It could be a bit cleaner to add close(fd) here and drop the one we
> >> have at the end of the function.
> >>
> > Here, close(fd)  is now positioned within the error handling block,
> > guaranteeing that
> > the file descriptor will be closed prior to returning from the
> > function in the event of a read error.
> > Meanwhile, the final close(fd) at the end of the function is retained
> > for successful execution,
> > thereby avoiding any potential resource leaks.
> > Hence, It is essential to add the close(fd) in both locations to
> > prevent resource leakage.
>
> I think Andrii was proposing the following solution:
>
> {
>         /* ...... */
>         got = read(fd, buf, sizeof(buf) - 1);
>         close(fd);
>         if (got <= 0) {
>                 *value = 0;
>                 return;
>         }
>         buf[got] = 0;
>
>         *value = strtoull(buf, NULL, 0);
> }
>
> It only invokes close(fd) once to handle both the failed case and the
> successful case.
> >
I greatly appreciate your insightful feedback on the review.
I will proceed to share the updated patch that includes the modifications.
> >> pw-bot: cr
> >>
> >>>         if (got <= 0) {
> >>>                 *value = 0;
> >>> +               close(fd);
> >>>                 return;
> >>>         }
> >>>         buf[got] = 0;
> >>> diff --git a/tools/testing/selftests/bpf/prog_tests/sk_assign.c b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> >>> index 0b9bd1d6f7cc..10a0ab954b8a 100644
> >>> --- a/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> >>> +++ b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> >>> @@ -37,8 +37,10 @@ configure_stack(void)
> >>>         tc = popen("tc -V", "r");
> >>>         if (CHECK_FAIL(!tc))
> >>>                 return false;
> >>> -       if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc)))
> >>> +       if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc))) {
> >>> +               pclose(tc);
> >> this one looks good
> >>
> >>>                 return false;
> >>> +       }
> >>>         if (strstr(tc_version, ", libbpf "))
> >>>                 prog = "test_sk_assign_libbpf.bpf.o";
> >>>         else
> >>> --
> >>> 2.43.0
> >>>
> > .
>
Re:[PATCH v2] selftests/bpf: close the file descriptor to avoid resource leaks
Posted by Malaya Kumar Rout 8 months, 2 weeks ago
Static Analyis for bench_htab_mem.c with cppcheck:error
tools/testing/selftests/bpf/benchs/bench_htab_mem.c:284:3:
error: Resource leak: fd [resourceLeak]
tools/testing/selftests/bpf/prog_tests/sk_assign.c:41:3:
error: Resource leak: tc [resourceLeak]

fix the issue  by closing the file descriptor (fd & tc) when
read & fgets operation fails.

Signed-off-by: Malaya Kumar Rout <malayarout91@gmail.com>
---
 tools/testing/selftests/bpf/benchs/bench_htab_mem.c | 3 +--
 tools/testing/selftests/bpf/prog_tests/sk_assign.c  | 4 +++-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
index 926ee822143e..297e32390cd1 100644
--- a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
+++ b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
@@ -279,6 +279,7 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
 	}
 
 	got = read(fd, buf, sizeof(buf) - 1);
+	close(fd);
 	if (got <= 0) {
 		*value = 0;
 		return;
@@ -286,8 +287,6 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
 	buf[got] = 0;
 
 	*value = strtoull(buf, NULL, 0);
-
-	close(fd);
 }
 
 static void htab_mem_measure(struct bench_res *res)
diff --git a/tools/testing/selftests/bpf/prog_tests/sk_assign.c b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
index 0b9bd1d6f7cc..10a0ab954b8a 100644
--- a/tools/testing/selftests/bpf/prog_tests/sk_assign.c
+++ b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
@@ -37,8 +37,10 @@ configure_stack(void)
 	tc = popen("tc -V", "r");
 	if (CHECK_FAIL(!tc))
 		return false;
-	if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc)))
+	if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc))) {
+		pclose(tc);
 		return false;
+	}
 	if (strstr(tc_version, ", libbpf "))
 		prog = "test_sk_assign_libbpf.bpf.o";
 	else
-- 
2.43.0
Re: [PATCH v2] selftests/bpf: close the file descriptor to avoid resource leaks
Posted by Hou Tao 8 months, 2 weeks ago

On 4/7/2025 6:01 PM, Malaya Kumar Rout wrote:
> Static Analyis for bench_htab_mem.c with cppcheck:error
> tools/testing/selftests/bpf/benchs/bench_htab_mem.c:284:3:
> error: Resource leak: fd [resourceLeak]
> tools/testing/selftests/bpf/prog_tests/sk_assign.c:41:3:
> error: Resource leak: tc [resourceLeak]
>
> fix the issue  by closing the file descriptor (fd & tc) when
> read & fgets operation fails.
>
> Signed-off-by: Malaya Kumar Rout <malayarout91@gmail.com>

Acked-by: Hou Tao <houtao1@huawei.com>

It will be better to resend the patch and change the subject prefix to
"[PATCH RESEND bpf-next v2]" instead of "[PATCH v2]".
> ---
>  tools/testing/selftests/bpf/benchs/bench_htab_mem.c | 3 +--
>  tools/testing/selftests/bpf/prog_tests/sk_assign.c  | 4 +++-
>  2 files changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> index 926ee822143e..297e32390cd1 100644
> --- a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> +++ b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> @@ -279,6 +279,7 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
>  	}
>  
>  	got = read(fd, buf, sizeof(buf) - 1);
> +	close(fd);
>  	if (got <= 0) {
>  		*value = 0;
>  		return;
> @@ -286,8 +287,6 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
>  	buf[got] = 0;
>  
>  	*value = strtoull(buf, NULL, 0);
> -
> -	close(fd);
>  }
>  
>  static void htab_mem_measure(struct bench_res *res)
> diff --git a/tools/testing/selftests/bpf/prog_tests/sk_assign.c b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> index 0b9bd1d6f7cc..10a0ab954b8a 100644
> --- a/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> +++ b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> @@ -37,8 +37,10 @@ configure_stack(void)
>  	tc = popen("tc -V", "r");
>  	if (CHECK_FAIL(!tc))
>  		return false;
> -	if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc)))
> +	if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc))) {
> +		pclose(tc);
>  		return false;
> +	}
>  	if (strstr(tc_version, ", libbpf "))
>  		prog = "test_sk_assign_libbpf.bpf.o";
>  	else
Re:[PATCH RESEND bpf-next v2] selftests/bpf: close the file descriptor to avoid resource leaks
Posted by Malaya Kumar Rout 8 months, 2 weeks ago
Static Analyis for bench_htab_mem.c with cppcheck:error
tools/testing/selftests/bpf/benchs/bench_htab_mem.c:284:3:
error: Resource leak: fd [resourceLeak]
tools/testing/selftests/bpf/prog_tests/sk_assign.c:41:3:
error: Resource leak: tc [resourceLeak]

fix the issue  by closing the file descriptor (fd & tc) when
read & fgets operation fails.

Signed-off-by: Malaya Kumar Rout <malayarout91@gmail.com>
---
 tools/testing/selftests/bpf/benchs/bench_htab_mem.c | 3 +--
 tools/testing/selftests/bpf/prog_tests/sk_assign.c  | 4 +++-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
index 926ee822143e..297e32390cd1 100644
--- a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
+++ b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
@@ -279,6 +279,7 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
 	}
 
 	got = read(fd, buf, sizeof(buf) - 1);
+	close(fd);
 	if (got <= 0) {
 		*value = 0;
 		return;
@@ -286,8 +287,6 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
 	buf[got] = 0;
 
 	*value = strtoull(buf, NULL, 0);
-
-	close(fd);
 }
 
 static void htab_mem_measure(struct bench_res *res)
diff --git a/tools/testing/selftests/bpf/prog_tests/sk_assign.c b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
index 0b9bd1d6f7cc..10a0ab954b8a 100644
--- a/tools/testing/selftests/bpf/prog_tests/sk_assign.c
+++ b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
@@ -37,8 +37,10 @@ configure_stack(void)
 	tc = popen("tc -V", "r");
 	if (CHECK_FAIL(!tc))
 		return false;
-	if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc)))
+	if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc))) {
+		pclose(tc);
 		return false;
+	}
 	if (strstr(tc_version, ", libbpf "))
 		prog = "test_sk_assign_libbpf.bpf.o";
 	else
-- 
2.43.0
Re: [PATCH RESEND bpf-next v2] selftests/bpf: close the file descriptor to avoid resource leaks
Posted by Andrii Nakryiko 8 months, 1 week ago
On Tue, Apr 8, 2025 at 11:33 AM Malaya Kumar Rout
<malayarout91@gmail.com> wrote:
>
> Static Analyis for bench_htab_mem.c with cppcheck:error

typo: analysis (lower case and typo)

you can also make into a bit more human-readable sentence:

"Static analysis found an issue in bench_htab_mem.c:


> tools/testing/selftests/bpf/benchs/bench_htab_mem.c:284:3:
> error: Resource leak: fd [resourceLeak]
> tools/testing/selftests/bpf/prog_tests/sk_assign.c:41:3:
> error: Resource leak: tc [resourceLeak]
>
> fix the issue  by closing the file descriptor (fd & tc) when
> read & fgets operation fails.

"Fix the issue by closing" (capitalization, single space between words

>
> Signed-off-by: Malaya Kumar Rout <malayarout91@gmail.com>
> ---
>  tools/testing/selftests/bpf/benchs/bench_htab_mem.c | 3 +--
>  tools/testing/selftests/bpf/prog_tests/sk_assign.c  | 4 +++-
>  2 files changed, 4 insertions(+), 3 deletions(-)
>

For some reason this patch didn't make it into our Patchworks system,
so we can't easily apply it. Please fix the above commit issues and
resubmit, hopefully this time it goes through just fine.

> diff --git a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> index 926ee822143e..297e32390cd1 100644
> --- a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> +++ b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> @@ -279,6 +279,7 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
>         }
>
>         got = read(fd, buf, sizeof(buf) - 1);
> +       close(fd);
>         if (got <= 0) {
>                 *value = 0;
>                 return;
> @@ -286,8 +287,6 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
>         buf[got] = 0;
>
>         *value = strtoull(buf, NULL, 0);
> -
> -       close(fd);
>  }
>
>  static void htab_mem_measure(struct bench_res *res)
> diff --git a/tools/testing/selftests/bpf/prog_tests/sk_assign.c b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> index 0b9bd1d6f7cc..10a0ab954b8a 100644
> --- a/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> +++ b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> @@ -37,8 +37,10 @@ configure_stack(void)
>         tc = popen("tc -V", "r");
>         if (CHECK_FAIL(!tc))
>                 return false;
> -       if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc)))
> +       if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc))) {
> +               pclose(tc);
>                 return false;
> +       }
>         if (strstr(tc_version, ", libbpf "))
>                 prog = "test_sk_assign_libbpf.bpf.o";
>         else
> --
> 2.43.0
>
Re: [PATCH RESEND bpf-next v2] selftests/bpf: close the file descriptor to avoid resource leaks
Posted by Alexei Starovoitov 8 months, 1 week ago
On Wed, Apr 9, 2025 at 4:28 PM Andrii Nakryiko
<andrii.nakryiko@gmail.com> wrote:
>
> On Tue, Apr 8, 2025 at 11:33 AM Malaya Kumar Rout
> <malayarout91@gmail.com> wrote:
> >
> > Static Analyis for bench_htab_mem.c with cppcheck:error
>
> typo: analysis (lower case and typo)
>
> you can also make into a bit more human-readable sentence:
>
> "Static analysis found an issue in bench_htab_mem.c:
>
>
> > tools/testing/selftests/bpf/benchs/bench_htab_mem.c:284:3:
> > error: Resource leak: fd [resourceLeak]
> > tools/testing/selftests/bpf/prog_tests/sk_assign.c:41:3:
> > error: Resource leak: tc [resourceLeak]
> >
> > fix the issue  by closing the file descriptor (fd & tc) when
> > read & fgets operation fails.
>
> "Fix the issue by closing" (capitalization, single space between words
>
> >
> > Signed-off-by: Malaya Kumar Rout <malayarout91@gmail.com>
> > ---
> >  tools/testing/selftests/bpf/benchs/bench_htab_mem.c | 3 +--
> >  tools/testing/selftests/bpf/prog_tests/sk_assign.c  | 4 +++-
> >  2 files changed, 4 insertions(+), 3 deletions(-)
> >
>
> For some reason this patch didn't make it into our Patchworks system,
> so we can't easily apply it. Please fix the above commit issues and
> resubmit, hopefully this time it goes through just fine.

I thought it was a maintenance issue with patchwork, but it's probably
something else.
I'm guessing your cc list confuses pw bot.
Pls drop linux-kselftest@vger and lkml@vger and keep bpf@vger only.
Re: [PATCH] selftests/bpf: close the file descriptor to avoid resource leaks
Posted by Hou Tao 8 months, 3 weeks ago

On 3/24/2025 2:42 PM, Malaya Kumar Rout wrote:
> Static Analyis for bench_htab_mem.c with cppcheck:error
> tools/testing/selftests/bpf/benchs/bench_htab_mem.c:284:3:
> error: Resource leak: fd [resourceLeak]
> tools/testing/selftests/bpf/prog_tests/sk_assign.c:41:3:
> error: Resource leak: tc [resourceLeak]
>
> fix the issue  by closing the file descriptor (fd & tc) when
> read & fgets operation fails.
>
> Signed-off-by: Malaya Kumar Rout <malayarout91@gmail.com>

Acked-by: Hou Tao <houtao1@huawei.com>

The right subject prefix for the patch should be "[PATCH bpf-next]",
however, it seems there is no need or no reason to respin the patch.
> ---
>  tools/testing/selftests/bpf/benchs/bench_htab_mem.c | 1 +
>  tools/testing/selftests/bpf/prog_tests/sk_assign.c  | 4 +++-
>  2 files changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> index 926ee822143e..59746fd2c23a 100644
> --- a/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> +++ b/tools/testing/selftests/bpf/benchs/bench_htab_mem.c
> @@ -281,6 +281,7 @@ static void htab_mem_read_mem_cgrp_file(const char *name, unsigned long *value)
>  	got = read(fd, buf, sizeof(buf) - 1);
>  	if (got <= 0) {
>  		*value = 0;
> +		close(fd);
>  		return;
>  	}
>  	buf[got] = 0;
> diff --git a/tools/testing/selftests/bpf/prog_tests/sk_assign.c b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> index 0b9bd1d6f7cc..10a0ab954b8a 100644
> --- a/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> +++ b/tools/testing/selftests/bpf/prog_tests/sk_assign.c
> @@ -37,8 +37,10 @@ configure_stack(void)
>  	tc = popen("tc -V", "r");
>  	if (CHECK_FAIL(!tc))
>  		return false;
> -	if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc)))
> +	if (CHECK_FAIL(!fgets(tc_version, sizeof(tc_version), tc))) {
> +		pclose(tc);
>  		return false;
> +	}
>  	if (strstr(tc_version, ", libbpf "))
>  		prog = "test_sk_assign_libbpf.bpf.o";
>  	else