From 56233ba8574c01b3912cf662335fedaabc7faec2 Mon Sep 17 00:00:00 2001 From: Juergen Christ Date: Mon, 29 Aug 2022 16:54:02 +0200 Subject: [PATCH] apps/speed.c: Wait for generated children In multi-mode, speed fork()s off several children but does not wait for them. On Linux, this leads to wrong accounting information of getrusage used by tools to extract running time and page faults. Wait for every children and check the return code and termination signal. Signed-off-by: Juergen Christ Reviewed-by: Paul Dale Reviewed-by: Tomas Mraz (Merged from https://github.com/openssl/openssl/pull/19093) --- apps/speed.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/apps/speed.c b/apps/speed.c index 469a1a4441a..9b9016b61c4 100644 --- a/apps/speed.c +++ b/apps/speed.c @@ -67,6 +67,7 @@ # define HAVE_FORK 0 # else # define HAVE_FORK 1 +# include # endif #endif @@ -3432,6 +3433,7 @@ static int do_multi(int multi, int size_num) int n; int fd[2]; int *fds; + int status; static char sep[] = ":"; fds = app_malloc(sizeof(*fds) * multi, "fd buffer for do_multi"); @@ -3581,6 +3583,20 @@ static int do_multi(int multi, int size_num) fclose(f); } OPENSSL_free(fds); + for (n = 0; n < multi; ++n) { + while (wait(&status) == -1) + if (errno != EINTR) { + BIO_printf(bio_err, "Waitng for child failed with 0x%x\n", + errno); + return 1; + } + if (WIFEXITED(status) && WEXITSTATUS(status)) { + BIO_printf(bio_err, "Child exited with %d\n", WEXITSTATUS(status)); + } else if (WIFSIGNALED(status)) { + BIO_printf(bio_err, "Child terminated by signal %d\n", + WTERMSIG(status)); + } + } return 1; } #endif -- 2.47.2