[PATCH] selftests/nolibc: test_fork: fix up duplicated print

Zhangjin Wu posted 1 patch 2 years, 8 months ago
tools/testing/selftests/nolibc/nolibc-test.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
[PATCH] selftests/nolibc: test_fork: fix up duplicated print
Posted by Zhangjin Wu 2 years, 8 months ago
running nolibc-test with glibc on x86_64 got such print issue:

    29 execve_root = -1 EACCES                                       [OK]
    30 fork30 fork = 0                                                      [OK]
    31 getdents64_root = 712                                         [OK]

The fork test case has three printf calls:

    (1) llen += printf("%d %s", test, #name);
    (2) llen += printf(" = %d %s ", expr, errorname(errno));
    (3) llen += pad_spc(llen, 64, "[FAIL]\n"); --> vfprintf()

In the following scene, the above issue happens:

    (a) The parent calls (1)
    (b) The parent calls fork()
    (c) The child runs and shares the print buffer of (1)
    (d) The child exits, flushs the print buffer and closes its own stdout/stderr
        * "30 fork" is printed at the first time.
    (e) The parent calls (2) and (3), with "\n" in (3), it flushs the whole buffer
        * "30 fork = 0 ..." is printed

Therefore, there are two "30 fork" in the stdout.

Between (a) and (b), if flush the stdout (and the sterr), the child in
stage (c) will not be able to 'see' the print buffer.

Signed-off-by: Zhangjin Wu <falcon@tinylab.org>
---
 tools/testing/selftests/nolibc/nolibc-test.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c
index 7de46305f419..88323a60aa4a 100644
--- a/tools/testing/selftests/nolibc/nolibc-test.c
+++ b/tools/testing/selftests/nolibc/nolibc-test.c
@@ -486,7 +486,13 @@ static int test_getpagesize(void)
 static int test_fork(void)
 {
 	int status;
-	pid_t pid = fork();
+	pid_t pid;
+
+	/* flush the printf buffer to avoid child flush it */
+	fflush(stdout);
+	fflush(stderr);
+
+	pid = fork();
 
 	switch (pid) {
 	case -1:
-- 
2.25.1
[PATCH] selftests/nolibc: test_fork: fix up duplicated print
Posted by Zhangjin Wu 2 years, 8 months ago
Hi, Willy

What about this one for 2023xxxx-nolibc-rv32+stkp6?

@Thomas, welcome your Reviewed-by If it is ok for you ;-)

Best regards,
Zhangjin

> running nolibc-test with glibc on x86_64 got such print issue:
> 
>     29 execve_root = -1 EACCES                                       [OK]
>     30 fork30 fork = 0                                                      [OK]
>     31 getdents64_root = 712                                         [OK]
> 
> The fork test case has three printf calls:
> 
>     (1) llen += printf("%d %s", test, #name);
>     (2) llen += printf(" = %d %s ", expr, errorname(errno));
>     (3) llen += pad_spc(llen, 64, "[FAIL]\n"); --> vfprintf()
> 
> In the following scene, the above issue happens:
> 
>     (a) The parent calls (1)
>     (b) The parent calls fork()
>     (c) The child runs and shares the print buffer of (1)
>     (d) The child exits, flushs the print buffer and closes its own stdout/stderr
>         * "30 fork" is printed at the first time.
>     (e) The parent calls (2) and (3), with "\n" in (3), it flushs the whole buffer
>         * "30 fork = 0 ..." is printed
> 
> Therefore, there are two "30 fork" in the stdout.
> 
> Between (a) and (b), if flush the stdout (and the sterr), the child in
> stage (c) will not be able to 'see' the print buffer.
> 
> Signed-off-by: Zhangjin Wu <falcon@tinylab.org>
> ---
>  tools/testing/selftests/nolibc/nolibc-test.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c
> index 7de46305f419..88323a60aa4a 100644
> --- a/tools/testing/selftests/nolibc/nolibc-test.c
> +++ b/tools/testing/selftests/nolibc/nolibc-test.c
> @@ -486,7 +486,13 @@ static int test_getpagesize(void)
>  static int test_fork(void)
>  {
>  	int status;
> -	pid_t pid = fork();
> +	pid_t pid;
> +
> +	/* flush the printf buffer to avoid child flush it */
> +	fflush(stdout);
> +	fflush(stderr);
> +
> +	pid = fork();
>  
>  	switch (pid) {
>  	case -1:
> -- 
> 2.25.1
> 
>
Re: [PATCH] selftests/nolibc: test_fork: fix up duplicated print
Posted by Thomas Weißschuh 2 years, 8 months ago
On 2023-06-02 10:41:57+0800, Zhangjin Wu wrote:
> Hi, Willy
> 
> What about this one for 2023xxxx-nolibc-rv32+stkp6?
> 
> @Thomas, welcome your Reviewed-by If it is ok for you ;-)

Indeed, good catch!

Reviewed-by: Thomas Weißschuh <linux@weissschuh.net>

> Best regards,
> Zhangjin
> 
> > running nolibc-test with glibc on x86_64 got such print issue:
> > 
> >     29 execve_root = -1 EACCES                                       [OK]
> >     30 fork30 fork = 0                                                      [OK]
> >     31 getdents64_root = 712                                         [OK]
> > 
> > The fork test case has three printf calls:
> > 
> >     (1) llen += printf("%d %s", test, #name);
> >     (2) llen += printf(" = %d %s ", expr, errorname(errno));
> >     (3) llen += pad_spc(llen, 64, "[FAIL]\n"); --> vfprintf()
> > 
> > In the following scene, the above issue happens:
> > 
> >     (a) The parent calls (1)
> >     (b) The parent calls fork()
> >     (c) The child runs and shares the print buffer of (1)
> >     (d) The child exits, flushs the print buffer and closes its own stdout/stderr
> >         * "30 fork" is printed at the first time.
> >     (e) The parent calls (2) and (3), with "\n" in (3), it flushs the whole buffer
> >         * "30 fork = 0 ..." is printed
> > 
> > Therefore, there are two "30 fork" in the stdout.
> > 
> > Between (a) and (b), if flush the stdout (and the sterr), the child in
> > stage (c) will not be able to 'see' the print buffer.
> > 
> > Signed-off-by: Zhangjin Wu <falcon@tinylab.org>
> > ---
> >  tools/testing/selftests/nolibc/nolibc-test.c | 8 +++++++-
> >  1 file changed, 7 insertions(+), 1 deletion(-)
> > 
> > diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c
> > index 7de46305f419..88323a60aa4a 100644
> > --- a/tools/testing/selftests/nolibc/nolibc-test.c
> > +++ b/tools/testing/selftests/nolibc/nolibc-test.c
> > @@ -486,7 +486,13 @@ static int test_getpagesize(void)
> >  static int test_fork(void)
> >  {
> >  	int status;
> > -	pid_t pid = fork();
> > +	pid_t pid;
> > +
> > +	/* flush the printf buffer to avoid child flush it */
> > +	fflush(stdout);
> > +	fflush(stderr);
> > +
> > +	pid = fork();
> >  
> >  	switch (pid) {
> >  	case -1:
> > -- 
> > 2.25.1
> > 
> > 
Re: [PATCH] selftests/nolibc: test_fork: fix up duplicated print
Posted by Willy Tarreau 2 years, 8 months ago
On Fri, Jun 02, 2023 at 12:20:34PM +0200, Thomas Weißschuh wrote:
> On 2023-06-02 10:41:57+0800, Zhangjin Wu wrote:
> > Hi, Willy
> > 
> > What about this one for 2023xxxx-nolibc-rv32+stkp6?
> > 
> > @Thomas, welcome your Reviewed-by If it is ok for you ;-)
> 
> Indeed, good catch!
> 
> Reviewed-by: Thomas Weißschuh <linux@weissschuh.net>

And queued, thanks to you both!
Willy