summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvgross <vgross@openbsd.org>2016-03-30 22:02:55 +0000
committervgross <vgross@openbsd.org>2016-03-30 22:02:55 +0000
commit5d84da69056012ce646a7062695b7905f44a97ec (patch)
treec3450523f1e42a8f7579de728b5084e86f15c9a7
parentAvoid compiler warning about zero-length printf format strings. (diff)
downloadwireguard-openbsd-5d84da69056012ce646a7062695b7905f44a97ec.tar.xz
wireguard-openbsd-5d84da69056012ce646a7062695b7905f44a97ec.zip
Cover the case where we are bound to [::] and SO_REUSEADDR is not set.
-rw-r--r--regress/sys/netinet6/pktinfo_addr/Makefile10
-rw-r--r--regress/sys/netinet6/pktinfo_addr/runtest.c28
2 files changed, 24 insertions, 14 deletions
diff --git a/regress/sys/netinet6/pktinfo_addr/Makefile b/regress/sys/netinet6/pktinfo_addr/Makefile
index 8d7adf84ff8..ee6d98f4163 100644
--- a/regress/sys/netinet6/pktinfo_addr/Makefile
+++ b/regress/sys/netinet6/pktinfo_addr/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.1 2016/03/19 15:09:13 vgross Exp $
+# $OpenBSD: Makefile,v 1.2 2016/03/30 22:02:55 vgross Exp $
PROG = runtest
TESTIFACE = vether11
@@ -27,8 +27,9 @@ run-regress-runtest: ${PROG}
${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b ${BASEADDR} -m ${ABSENTADDR} -e 49
${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b ${BASEADDR} -o ${FIRSTADDR} -e 48
${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b ${BASEADDR} -m ${FIRSTADDR} -e 48
- ${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b :: -o ${BASEADDR} -e 0
- ${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b :: -m ${BASEADDR} -e 0
+ ${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b :: -e 0
+ ${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b :: -o ${ADDR_3} -e 0
+ ${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b :: -m ${ADDR_3} -e 0
${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b :: -o ${FIRSTADDR} -e 48
${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b :: -m ${FIRSTADDR} -e 48
${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b ${BASEADDR} -o :: -e 0
@@ -37,6 +38,9 @@ run-regress-runtest: ${PROG}
${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b ${BASEADDR} -o ${ABSENTADDR} -m ${ADDR_4} -e 0
${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b ${BASEADDR} -o ${ADDR_3} -m :: -e 0
${.OBJDIR}/${PROG} -d ${DESTADDR} -f ${FIRSTADDR} -b ${BASEADDR} -o ${FIRSTADDR} -m :: -e 0
+ ${.OBJDIR}/${PROG} -d ${DESTADDR} -b :: -e 0
+ ${.OBJDIR}/${PROG} -d ${DESTADDR} -b :: -o ${ADDR_3} -e 0
+ ${.OBJDIR}/${PROG} -d ${DESTADDR} -b :: -m ${ADDR_3} -e 0
${SUDO} ifconfig ${TESTIFACE} destroy
.include <bsd.regress.mk>
diff --git a/regress/sys/netinet6/pktinfo_addr/runtest.c b/regress/sys/netinet6/pktinfo_addr/runtest.c
index 9ce291884cb..e787c8105a4 100644
--- a/regress/sys/netinet6/pktinfo_addr/runtest.c
+++ b/regress/sys/netinet6/pktinfo_addr/runtest.c
@@ -50,6 +50,7 @@ main(int argc, char *argv[])
int ch, rc, wstat, expected = -1;
int first_sock;
+ int reuse_addr = 0;
pid_t pid;
const char *numerr;
@@ -102,9 +103,6 @@ main(int argc, char *argv[])
optreset = 1; optind++;
} while (optind < argc);
- if (*first_sin6p == NULL)
- errx(2, "first_sin6p == NULL");
-
if (*bind_sin6p == NULL)
errx(2, "bind_sin6p == NULL");
@@ -114,15 +112,20 @@ main(int argc, char *argv[])
if (expected < 0)
errx(2, "need expected");
- first_sock = udp6_first(*first_sin6p);
+ if (*first_sin6p) {
+ first_sock = udp6_first(*first_sin6p);
+ reuse_addr = 1;
+ }
pid = fork();
if (pid == 0) {
return udp6_override(*dst_sin6p, *bind_sin6p,
- *setsockopt_sin6p, *sendmsg_sin6p);
+ *setsockopt_sin6p, *sendmsg_sin6p, reuse_addr);
}
(void)wait(&wstat);
- close(first_sock);
+
+ if (*first_sin6p)
+ close(first_sock);
if (! WIFEXITED(wstat))
errx(2, "error setting up override");
@@ -152,7 +155,8 @@ udp6_first(struct sockaddr_in6 *src)
int
udp6_override(struct sockaddr_in6 *dst, struct sockaddr_in6 *src_bind,
- struct sockaddr_in6 *src_setsockopt, struct sockaddr_in6 *src_sendmsg)
+ struct sockaddr_in6 *src_setsockopt, struct sockaddr_in6 *src_sendmsg,
+ int reuse_addr)
{
int s, optval, error, saved_errno;
ssize_t send_rc;
@@ -176,10 +180,12 @@ udp6_override(struct sockaddr_in6 *dst, struct sockaddr_in6 *src_bind,
kill(getpid(), SIGTERM);
}
- optval = 1;
- if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int))) {
- warn("udp6_override: setsockopt(SO_REUSEADDR)");
- kill(getpid(), SIGTERM);
+ if (reuse_addr) {
+ optval = 1;
+ if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int))) {
+ warn("udp6_override: setsockopt(SO_REUSEADDR)");
+ kill(getpid(), SIGTERM);
+ }
}
if (bind(s, (struct sockaddr *)src_bind, src_bind->sin6_len)) {