INN commit: trunk (5 files)

INN Commit rra at isc.org
Mon Aug 10 18:29:31 UTC 2020


    Date: Monday, August 10, 2020 @ 11:29:30
  Author: iulius
Revision: 10388

Update to latest rra-c-util upstream version

Modified:
  trunk/lib/snprintf.c
  trunk/m4/snprintf.m4
  trunk/support/getrra-c-util
  trunk/tests/lib/network/server-t.c
  trunk/tests/lib/snprintf-t.c

------------------------------+
 lib/snprintf.c               |    5 +
 m4/snprintf.m4               |    5 +
 support/getrra-c-util        |   14 +++-
 tests/lib/network/server-t.c |  115 ++++++++++++++++++++++++++++++-----------
 tests/lib/snprintf-t.c       |    5 +
 5 files changed, 105 insertions(+), 39 deletions(-)

Modified: lib/snprintf.c
===================================================================
--- lib/snprintf.c	2020-06-14 12:51:00 UTC (rev 10387)
+++ lib/snprintf.c	2020-08-10 18:29:30 UTC (rev 10388)
@@ -11,8 +11,9 @@
  * that later merges with the original source are easy.  Bug fixes and
  * improvements should be sent back to the original author.
  *
- * The canonical version of this file is maintained in the rra-c-util package,
- * which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
+ * The canonical version of this file was maintained (until 2020) in the
+ * rra-c-util package, which can be found at
+ * <https://www.eyrie.org/~eagle/software/rra-c-util/>.
  */
 
 /*

Modified: m4/snprintf.m4
===================================================================
--- m4/snprintf.m4	2020-06-14 12:51:00 UTC (rev 10387)
+++ m4/snprintf.m4	2020-08-10 18:29:30 UTC (rev 10388)
@@ -10,8 +10,9 @@
 dnl Provides INN_FUNC_SNPRINTF, which adds snprintf.o to LIBOBJS unless a
 dnl fully working snprintf is found.
 dnl
-dnl The canonical version of this file is maintained in the rra-c-util
-dnl package, available at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
+dnl The canonical version of this file was maintained (until 2020) in the
+dnl rra-c-util package, available at
+dnl <https://www.eyrie.org/~eagle/software/rra-c-util/>.
 dnl
 dnl Written by Russ Allbery <eagle at eyrie.org>
 dnl Copyright 2006, 2008-2009

Modified: support/getrra-c-util
===================================================================
--- support/getrra-c-util	2020-06-14 12:51:00 UTC (rev 10387)
+++ support/getrra-c-util	2020-08-10 18:29:30 UTC (rev 10388)
@@ -161,7 +161,16 @@
 extern int symlink(const char *, const char *);\\
 #endif\\
 " \
-               -e "172 i \\
+               -e "147 i \\
+#if !HAVE_DECL_SNPRINTF\\
+extern int snprintf(char *, size_t, const char *, ...)\\
+    __attribute__((__format__(printf, 3, 4)));\\
+#endif\\
+#if !HAVE_DECL_VSNPRINTF\\
+extern int vsnprintf(char *, size_t, const char *, va_list)\\
+    __attribute__((__format__(printf, 3, 0)));\\
+#endif" \
+               -e "164 i \\
 #if !HAVE_DECL_STRLCAT\\
 extern size_t strlcat(char *, const char *, size_t);\\
 #endif\\
@@ -246,7 +255,6 @@
 download m4/perl.m4 m4 perl.m4
 download m4/python.m4 m4 python.m4
 download m4/sasl.m4 m4 sasl.m4
-download m4/snprintf.m4 m4 snprintf.m4
 download m4/socket-unix.m4 m4 socket-unix.m4
 download m4/socket.m4 m4 socket.m4
 download m4/vamacros.m4 m4 vamacros.m4
@@ -266,7 +274,6 @@
 download portable/reallocarray.c lib reallocarray.c
 download portable/setenv.c lib setenv.c
 download portable/seteuid.c lib seteuid.c
-download portable/snprintf.c lib snprintf.c
 download portable/socket.h include/portable socket.h
 download portable/socket-unix.h include/portable socket-unix.h
 download portable/stdbool.h include/portable stdbool.h
@@ -300,7 +307,6 @@
 download tests/portable/mkstemp-t.c tests/lib mkstemp-t.c
 download tests/portable/reallocarray-t.c tests/lib reallocarray-t.c
 download tests/portable/setenv-t.c tests/lib setenv-t.c
-download tests/portable/snprintf-t.c tests/lib snprintf-t.c
 
 ##  Synchronize test suite files for utility functions from upstream.
 download tests/util/buffer-t.c tests/lib buffer-t.c

Modified: tests/lib/network/server-t.c
===================================================================
--- tests/lib/network/server-t.c	2020-06-14 12:51:00 UTC (rev 10387)
+++ tests/lib/network/server-t.c	2020-08-10 18:29:30 UTC (rev 10388)
@@ -151,13 +151,13 @@
  * This also verifies that network_client_create works properly.
  */
 __attribute__((__noreturn__)) static void
-client_udp_writer(const char *source)
+client_ipv4_udp_writer(const char *source)
 {
     socket_type fd;
     struct sockaddr_in sin;
 
     /* Create and bind the socket. */
-    fd = network_client_create(PF_INET, SOCK_DGRAM, source);
+    fd = network_client_create(AF_INET, SOCK_DGRAM, source);
     if (fd == INVALID_SOCKET)
         _exit(1);
 
@@ -177,6 +177,42 @@
 
 
 /*
+ * The same as client_ipv4_udp_writer, but sents the packet via IPv6 instead.
+ * If somehow this was called without IPv6 being available (which should be
+ * impossible), do nothing and exit with a non-zero status.
+ */
+__attribute__((__noreturn__)) static void
+client_ipv6_udp_writer(const char *source)
+{
+#ifdef HAVE_INET6
+    socket_type fd;
+    struct sockaddr_in6 sin6;
+
+    /* Create and bind the socket. */
+    fd = network_client_create(AF_INET6, SOCK_DGRAM, source);
+    if (fd == INVALID_SOCKET)
+        _exit(1);
+
+    /* Connect to localhost port 11119. */
+    memset(&sin6, 0, sizeof(sin6));
+    sin6.sin6_family = AF_INET6;
+    sin6.sin6_port = htons(11119);
+    if (inet_pton(AF_INET6, "::1", &sin6.sin6_addr) < 1)
+        sysbail("cannot convert ::1 to an in6_addr");
+    if (connect(fd, (struct sockaddr *) &sin6, sizeof(sin6)) < 0)
+        _exit(1);
+
+    /* Send our fixed UDP packet. */
+    if (send(fd, "socket test\r\n", 13, 0) < 13)
+        _exit(1);
+    _exit(0);
+#else
+    _exit(1);
+#endif
+}
+
+
+/*
  * When testing the bind (server) functions, we create listening sockets, fork
  * a child process to connect to it, and accept the connection and read the
  * data in the server.  The test reporting is therefore done by the listener.
@@ -239,13 +275,14 @@
  * A variant version of the server portion of the test.  Takes an array of
  * sockets and the size of the sockets and accepts a connection on any of
  * those sockets.  Ensures that the client address information is stored
- * correctly by checking that it is an IPv4 address.  For skipping purposes,
- * this produces three tests.
+ * correctly by checking that it is an IPv4 or IPv6 address.  For skipping
+ * purposes, this produces three tests.
  *
  * Normally, the client address should be 127.0.0.1, but hosts with odd local
  * networking setups may rewrite client IP addresses so that they appear to
- * come from other addresses.  Avoid checking if the client IP is 127.0.0.1
- * for that reason.  Hopefully this won't hide bugs.
+ * come from other addresses.  Hosts that only have IPv6 interfaces will see a
+ * client connection on ::1 instead.  Avoid checking if the client IP is
+ * 127.0.0.1 for that reason.  Hopefully this won't hide bugs.
  *
  * saddr is allocated from the heap instead of using a local struct
  * sockaddr_storage to work around a misdiagnosis of strict aliasing
@@ -267,7 +304,10 @@
     saddr = bcalloc(1, slen);
     client = network_accept_any(fds, count, saddr, &slen);
     test_server_connection(client);
-    is_int(AF_INET, saddr->sa_family, "...address family is IPv4");
+    if (saddr->sa_family == AF_INET)
+        is_int(AF_INET, saddr->sa_family, "...address family is IPv4");
+    else
+        is_int(AF_INET6, saddr->sa_family, "...address family is IPv6");
     free(saddr);
     for (i = 0; i < count; i++)
         socket_close(fds[i]);
@@ -465,20 +505,37 @@
     socket_type *fds;
     unsigned int count, i;
     pid_t child;
-    int status;
+    int status, family;
+    struct sockaddr *saddr;
 
+    /* Bind our socket.
+     *
+     * If the host has no IPv4 addresses, we may have only an IPv6 socket and
+     * thus can't us an IPv4 client.  Determine the address family of the
+     * first socket so that we can use an appropriate client.
+     */
     if (!network_bind_all(SOCK_STREAM, 11119, &fds, &count))
         sysbail("cannot create or bind socket");
+    saddr = get_sockaddr(fds[0]);
+    family = saddr->sa_family;
+    free(saddr);
     ok(1, "network_accept_any test");
+
+    /* Listen on all bound sockets. */
     for (i = 0; i < count; i++)
         if (listen(fds[i], 1) < 0)
             sysbail("cannot listen to socket %d", fds[i]);
+
+    /* Write a packet from a client and receive it on the server. */
     child = fork();
     if (child < 0)
         sysbail("cannot fork");
-    else if (child == 0)
-        client_writer("127.0.0.1", NULL, true);
-    else {
+    else if (child == 0) {
+        if (family == AF_INET)
+            client_writer("127.0.0.1", NULL, true);
+        else
+            client_writer("::1", NULL, true);
+    } else {
         test_server_accept_any(fds, count);
         waitpid(child, &status, 0);
         is_int(0, status, "client made correct connections");
@@ -501,22 +558,34 @@
     pid_t child;
     char buffer[BUFSIZ];
     ssize_t length;
-    int status;
+    int status, family;
     struct sockaddr_storage addr;
     struct sockaddr *saddr;
-    struct sockaddr_in sin;
     socklen_t addrlen;
 
-    /* Bind our UDP socket. */
+    /*
+     * Bind our UDP socket.
+     *
+     * If the host has no IPv4 addresses, we may have only an IPv6 socket and
+     * thus can't us an IPv4 client.  Determine the address family of the
+     * first socket so that we can use an appropriate client.
+     */
     if (!network_bind_all(SOCK_DGRAM, 11119, &fds, &count))
         sysbail("cannot create or bind socket");
+    saddr = get_sockaddr(fds[0]);
+    family = saddr->sa_family;
+    free(saddr);
 
     /* Create a child that writes a single UDP packet to the server. */
     child = fork();
     if (child < 0)
         sysbail("cannot fork");
-    else if (child == 0)
-        client_udp_writer("127.0.0.1");
+    else if (child == 0) {
+        if (family == AF_INET)
+            client_ipv4_udp_writer("127.0.0.1");
+        else
+            client_ipv6_udp_writer("::1");
+    }
 
     /* Set an alarm, since if the client malfunctions, nothing happens. */
     alarm(5);
@@ -531,19 +600,7 @@
         addrlen = sizeof(addr);
         length = recvfrom(fd, buffer, sizeof(buffer), 0, saddr, &addrlen);
         is_int(13, length, "...of correct length");
-        sin.sin_family = AF_INET;
-        sin.sin_port = htons(11119);
-
-        /*
-         * We'd prefer to check that the client IP address is 127.0.0.1 here,
-         * but hosts with odd local networking setups may rewrite the client
-         * IP address to something else.  To avoid false positives, just
-         * blindly trust the client IP address is correct, since it seems
-         * unlikely we'll have a server code bug here.
-         */
-        sin.sin_addr = ((struct sockaddr_in *) &addr)->sin_addr;
-        ok(network_sockaddr_equal((struct sockaddr *) &sin, saddr),
-           "...from correct family and port");
+        is_int(family, saddr->sa_family, "...from correct family");
         buffer[13] = '\0';
         is_string("socket test\r\n", buffer, "...and correct contents");
     }

Modified: tests/lib/snprintf-t.c
===================================================================
--- tests/lib/snprintf-t.c	2020-06-14 12:51:00 UTC (rev 10387)
+++ tests/lib/snprintf-t.c	2020-08-10 18:29:30 UTC (rev 10388)
@@ -2,8 +2,9 @@
  *
  * snprintf test suite.
  *
- * The canonical version of this file is maintained in the rra-c-util package,
- * which can be found at <https://www.eyrie.org/~eagle/software/rra-c-util/>.
+ * The canonical version of this file was maintained (until 2020) in the
+ * rra-c-util package, which can be found at
+ * <https://www.eyrie.org/~eagle/software/rra-c-util/>.
  *
  * Written by Russ Allbery <eagle at eyrie.org>
  * Copyright 2000-2006, 2018-2020 Russ Allbery <eagle at eyrie.org>



More information about the inn-committers mailing list