Module Name: src Committed By: mlelstv Date: Sun Nov 4 08:48:01 UTC 2018
Modified Files: src/sys/netinet6: udp6_usrreq.c Log Message: Fix error path in ip6 source address selection. in6_selectsrc previously returned a pointer to an ipv6 address, the pointer was NULL in case of an error and is checked later instead of the also returned error code. When in6_selectsrc was changed to store the address into a buffer, the error code was still ignored, but the buffer pointer was never set to NULL. As a result send() to an ipv6 address on a system that isn't configured for ipv6 no longer returns the expected EADDRAVAIL but fails later in ip6_output with EOPNOTSUPP when trying to send from an unspecified address. The wrong error code caused BIND to log the unexpected errors. To generate a diff of this commit: cvs rdiff -u -r1.141 -r1.142 src/sys/netinet6/udp6_usrreq.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netinet6/udp6_usrreq.c diff -u src/sys/netinet6/udp6_usrreq.c:1.141 src/sys/netinet6/udp6_usrreq.c:1.142 --- src/sys/netinet6/udp6_usrreq.c:1.141 Sat Apr 28 13:26:57 2018 +++ src/sys/netinet6/udp6_usrreq.c Sun Nov 4 08:48:01 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: udp6_usrreq.c,v 1.141 2018/04/28 13:26:57 maxv Exp $ */ +/* $NetBSD: udp6_usrreq.c,v 1.142 2018/11/04 08:48:01 mlelstv Exp $ */ /* $KAME: udp6_usrreq.c,v 1.86 2001/05/27 17:33:00 itojun Exp $ */ /* $KAME: udp6_output.c,v 1.43 2001/10/15 09:19:52 itojun Exp $ */ @@ -63,7 +63,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.141 2018/04/28 13:26:57 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.142 2018/11/04 08:48:01 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -763,7 +763,10 @@ udp6_output(struct in6pcb * const in6p, in6p->in6p_moptions, &in6p->in6p_route, &in6p->in6p_laddr, &oifp, &psref, &_laddr); - /* XXX need error check? */ + if (error) + laddr = NULL; + else + laddr = &_laddr; if (oifp && scope_ambiguous && (error = in6_setscope(&sin6->sin6_addr, oifp, NULL))) { @@ -773,7 +776,6 @@ udp6_output(struct in6pcb * const in6p, } if_put(oifp, &psref); curlwp_bindx(bound); - laddr = &_laddr; } else { /* * XXX: freebsd[34] does not have in_selectsrc, but