From f34c4d0f10ed09500d5f0ebd473c3f37ce4989d7 Mon Sep 17 00:00:00 2001 From: Matheus Castanho Date: Wed, 12 Feb 2020 13:07:32 -0300 Subject: [PATCH] sunrpc: Properly clean up if tst-udp-timeout fails The macro TEST_VERIFY_EXIT is used several times on sunrpc/tst-udp-timeout to exit the test if a condition evaluates to false. The side effect is that the code to terminate the RPC server process is not executed when the program calls exit, so that sub-process stays alive. This commit registers a clean up function with atexit to kill the server process before exiting the main program. Reviewed-by: Tulio Magno Quites Machado Filho --- sunrpc/tst-udp-timeout.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/sunrpc/tst-udp-timeout.c b/sunrpc/tst-udp-timeout.c index 8d45365b23..26869f5547 100644 --- a/sunrpc/tst-udp-timeout.c +++ b/sunrpc/tst-udp-timeout.c @@ -29,6 +29,9 @@ #include #include #include +#include + +static pid_t server_pid; /* Test data serialization and deserialization. */ @@ -177,6 +180,14 @@ server_dispatch (struct svc_req *request, SVCXPRT *transport) } } +/* Function to be called before exit to make sure the + server process is properly killed. */ +static void +kill_server (void) +{ + kill (server_pid, SIGTERM); +} + /* Implementation of the test client. */ static struct test_response @@ -381,16 +392,17 @@ do_test (void) TEST_VERIFY_EXIT (transport != NULL); TEST_VERIFY (svc_register (transport, PROGNUM, VERSNUM, server_dispatch, 0)); - pid_t pid = xfork (); - if (pid == 0) + server_pid = xfork (); + if (server_pid == 0) { svc_run (); FAIL_EXIT1 ("supposed to be unreachable"); } + atexit (kill_server); test_udp_server (transport->xp_port); int status; - xwaitpid (pid, &status, 0); + xwaitpid (server_pid, &status, 0); TEST_VERIFY (WIFEXITED (status) && WEXITSTATUS (status) == EXIT_MARKER); SVC_DESTROY (transport);