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