From: "Steven Rostedt (Google)" <rostedt@xxxxxxxxxxx> valgrind triggers its reports when the application exits. If the application does a fork() and the child exits, it will still trigger a report saying that the memory that was currently allocated by the parent has leaked. To prevent this, call execl() on a shell script that will simply exit with the proper error code. This will keep valgrind from producing a report on the child for the memory that is still allocated by the parent. Signed-off-by: Steven Rostedt (Google) <rostedt@xxxxxxxxxxx> --- Changes since v1: https://lore.kernel.org/linux-trace-devel/20230607135256.41a9ab6b@xxxxxxxxxxxxxxxxxx/ - test "/bin/sh" too, as not all systems have "/usr/bin/sh" utest/tracecmd-utest.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/utest/tracecmd-utest.c b/utest/tracecmd-utest.c index 34fed1e1..6ba2318e 100644 --- a/utest/tracecmd-utest.c +++ b/utest/tracecmd-utest.c @@ -131,6 +131,7 @@ static int pipe_it(int *ofd, int *efd, int (*func)(void *), goto fail; if (!pid) { + char shret[32]; close(obrass[0]); close(STDOUT_FILENO); @@ -143,6 +144,23 @@ static int pipe_it(int *ofd, int *efd, int (*func)(void *), exit(-1); ret = func(data); + + /* + * valgrind triggers its reports when the application + * exits. If the application does a fork() and the child + * exits, it will still trigger the valgrind report for + * all the allocations that were not freed by the parent. + * + * To prevent valgrind from triggering, do an execl() on + * a basic shell that will simply exit with the return value. + * This will quiet valgrind from reporting memory that has + * been allocated by the parent up to here. + */ + snprintf(shret, 32, "exit %d", ret); + execl("/usr/bin/sh", "/usr/bin/sh", "-c", shret, NULL); + execl("/bin/sh", "/bin/sh", "-c", shret, NULL); + + /* If the above execl() fails, simply do an exit */ exit(ret); } -- 2.35.1