From da628792ddf7a3d3cb8f8b770c7dbb9b9d67444b Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Sat, 24 Apr 2021 21:40:58 +0100 Subject: [PATCH] tests/connect-uri.c: Ensure Unix domain socket is cleaned up on exit Commit 70f83fed13 ("tests: Create test sockets in /tmp instead of local directory.") aimed to create sockets with short path names in /tmp. However it never cleaned them up. Worse still, every time the Makefile was evaluated at all a temporary file was created. Fix this properly in the C file. Fixes: commit 70f83fed131c7e52b1a31a28d9acaf19f6c11d57 (cherry picked from commit f5955c4c5bb0269e192b906a3ef98601aa63ad59) (cherry picked from commit 502f0b59ec1dbd64c6c64279316e03540258a54c) --- tests/Makefile.am | 16 ++++++---------- tests/connect-uri.c | 45 +++++++++++++++++++++++++++++++++++++++------ 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/tests/Makefile.am b/tests/Makefile.am index 436e1c10..ed5585a5 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -525,15 +525,13 @@ connect_uri_nbd_CPPFLAGS = \ connect_uri_nbd_CFLAGS = $(AM_CFLAGS) connect_uri_nbd_LDADD = $(top_builddir)/lib/libnbd.la -CONNECT_URI_NBD_UNIX_SOCKET := \ - $(shell mktemp /tmp/connect-uri-nbd-unix-socket-XXXXXX) connect_uri_nbd_unix_SOURCES = connect-uri.c connect_uri_nbd_unix_CPPFLAGS = \ $(AM_CPPFLAGS) \ - -DSERVER_PARAMS='"-U", SOCKET' \ - -DSOCKET='"$(CONNECT_URI_NBD_UNIX_SOCKET)"' \ + -DNEEDS_UNIX_SOCKET=1 \ + -DSERVER_PARAMS='"-U", UNIX_SOCKET' \ -DPIDFILE='"connect-uri-nbd-unix.pid"' \ - -DURI='"nbd+unix:///?socket=" SOCKET' + -DURI='"nbd+unix:///?socket="' # UNIX_SOCKET appended connect_uri_nbd_unix_CFLAGS = $(WARNINGS_CFLAGS) connect_uri_nbd_unix_LDADD = $(top_builddir)/lib/libnbd.la @@ -559,15 +557,13 @@ connect_uri_nbds_CPPFLAGS = \ $(NULL) connect_uri_nbds_LDADD = $(top_builddir)/lib/libnbd.la -CONNECT_URI_NBDS_UNIX_SOCKET := \ - $(shell mktemp /tmp/connect-uri-nbds-unix-socket-XXXXXX) connect_uri_nbds_unix_SOURCES = connect-uri.c connect_uri_nbds_unix_CPPFLAGS = \ $(AM_CPPFLAGS) \ - -DSERVER_PARAMS='"-U", SOCKET, "--tls=require", "--tls-certificates=pki"' \ - -DSOCKET='"$(CONNECT_URI_NBDS_UNIX_SOCKET)"' \ + -DNEEDS_UNIX_SOCKET=1 \ + -DSERVER_PARAMS='"-U", UNIX_SOCKET, "--tls=require", "--tls-certificates=pki"' \ -DPIDFILE='"connect-uri-nbds-unix.pid"' \ - -DURI='"nbds+unix:///?socket=" SOCKET' + -DURI='"nbds+unix:///?socket="' # UNIX_SOCKET appended connect_uri_nbds_unix_CFLAGS = $(WARNINGS_CFLAGS) connect_uri_nbds_unix_LDADD = $(top_builddir)/lib/libnbd.la diff --git a/tests/connect-uri.c b/tests/connect-uri.c index 6e7d1685..ce9e4d9b 100644 --- a/tests/connect-uri.c +++ b/tests/connect-uri.c @@ -29,16 +29,49 @@ #include +#ifdef NEEDS_UNIX_SOCKET +#define UNIX_SOCKET tmp +static char tmp[] = "/tmp/nbdXXXXXX"; + +static void +unlink_unix_socket (void) +{ + unlink (UNIX_SOCKET); +} +#endif /* NEEDS_UNIX_SOCKET */ + int main (int argc, char *argv[]) { struct nbd_handle *nbd; pid_t pid; size_t i; +#ifdef NEEDS_UNIX_SOCKET + char *uri; +#else + const char *uri = URI; +#endif + +#ifdef NEEDS_UNIX_SOCKET + int fd = mkstemp (UNIX_SOCKET); + if (fd == -1 || + close (fd) == -1) { + perror (UNIX_SOCKET); + exit (EXIT_FAILURE); + } + /* We have to remove the temporary file first, since we will create + * a socket in its place, and ensure the socket is removed on exit. + */ + unlink_unix_socket (); + atexit (unlink_unix_socket); -#ifdef SOCKET - unlink (SOCKET); + /* uri = URI + UNIX_SOCKET */ + if (asprintf (&uri, "%s%s", URI, UNIX_SOCKET) == -1) { + perror ("asprintf"); + exit (EXIT_FAILURE); + } #endif + unlink (PIDFILE); pid = fork (); @@ -75,13 +108,13 @@ main (int argc, char *argv[]) nbd_set_uri_allow_local_file (nbd, true); - if (nbd_connect_uri (nbd, URI) == -1) { + if (nbd_connect_uri (nbd, uri) == -1) { fprintf (stderr, "%s\n", nbd_get_error ()); exit (EXIT_FAILURE); } /* Check we negotiated the right kind of connection. */ - if (strncmp (URI, "nbds", 4) == 0) { + if (strncmp (uri, "nbds", 4) == 0) { if (! nbd_get_tls_negotiated (nbd)) { fprintf (stderr, "%s: failed to negotiate a TLS connection\n", argv[0]); @@ -95,8 +128,8 @@ main (int argc, char *argv[]) } nbd_close (nbd); -#ifdef SOCKET - unlink (SOCKET); +#ifdef NEEDS_UNIX_SOCKET + free (uri); #endif exit (EXIT_SUCCESS); } -- 2.43.0