diff options
Diffstat (limited to 'sys/netinet/udp_usrreq.c')
| -rw-r--r-- | sys/netinet/udp_usrreq.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 064f1e2f321f..493f1fd8a555 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -745,7 +745,7 @@ udp_output(inp, m, addr, control, td) return EMSGSIZE; } - src.sin_addr.s_addr = INADDR_ANY; + src.sin_family = 0; if (control != NULL) { /* * XXX: Currently, we assume all the optional information @@ -795,7 +795,7 @@ udp_output(inp, m, addr, control, td) return error; } - if (src.sin_addr.s_addr != INADDR_ANY || + if (src.sin_family == AF_INET || addr != NULL) { INP_INFO_WLOCK(&udbinfo); unlock_udbinfo = 1; @@ -807,10 +807,17 @@ udp_output(inp, m, addr, control, td) mac_create_mbuf_from_inpcb(inp, m); #endif + /* + * If the IP_SENDSRCADDR control message was specified, override the + * source address for this datagram. Its use is invalidated if the + * address thus specified is incomplete or clobbers other inpcbs. + */ laddr = inp->inp_laddr; lport = inp->inp_lport; - if (src.sin_addr.s_addr != INADDR_ANY) { - if (lport == 0) { + if (src.sin_family == AF_INET) { + if ((lport == 0) || + (laddr.s_addr == INADDR_ANY && + src.sin_addr.s_addr == INADDR_ANY)) { error = EINVAL; goto release; } |
