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 <tuliom@linux.ibm.com>
This commit is contained in:
Matheus Castanho 2020-02-12 13:07:32 -03:00 committed by Tulio Magno Quites Machado Filho
parent 0a8ce6a096
commit f34c4d0f10
1 changed files with 15 additions and 3 deletions

View File

@ -29,6 +29,9 @@
#include <sys/socket.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
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);