diff options
author | 2016-03-30 22:02:55 +0000 | |
---|---|---|
committer | 2016-03-30 22:02:55 +0000 | |
commit | 5d84da69056012ce646a7062695b7905f44a97ec (patch) | |
tree | c3450523f1e42a8f7579de728b5084e86f15c9a7 | |
parent | Avoid compiler warning about zero-length printf format strings. (diff) | |
download | wireguard-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/Makefile | 10 | ||||
-rw-r--r-- | regress/sys/netinet6/pktinfo_addr/runtest.c | 28 |
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)) { |