diff options
author | bz <bz@FreeBSD.org> | 2011-03-19 19:08:54 +0000 |
---|---|---|
committer | bz <bz@FreeBSD.org> | 2011-03-19 19:08:54 +0000 |
commit | 7b8d9ca423a772ee3a8a1f00b0087f7b6e52f53b (patch) | |
tree | d4d74c2013c8f1d9bf4b3a01ebc1dd7ca80aef06 /sys/netinet/in_pcb.c | |
parent | 9dffdca01d441bda85751cdc8103689208630bae (diff) | |
download | FreeBSD-src-7b8d9ca423a772ee3a8a1f00b0087f7b6e52f53b.zip FreeBSD-src-7b8d9ca423a772ee3a8a1f00b0087f7b6e52f53b.tar.gz |
Properly check for an IPv4 socket after r219579.
In some cases as udp6_connect() without an earlier bind(2) to an
address, v4-mapped scokets allowed and a non mapped destination
address, we can end up here with both v4 and v6 indicated:
inp_vflag = (INP_IPV4|INP_IPV6|INP_IPV6PROTO)
In that case however laddrp is NULL as the IPv6 path does not
pass in a copy currently.
Reported by: Pawel Worach (pawel.worach gmail.com)
Tested by: Pawel Worach (pawel.worach gmail.com)
MFC after: 6 days
X-MFC with: r219579
Diffstat (limited to 'sys/netinet/in_pcb.c')
-rw-r--r-- | sys/netinet/in_pcb.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index 39062b3..03c98ff 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -387,7 +387,7 @@ in_pcb_lport(struct inpcb *inp, struct in_addr *laddrp, u_short *lportp, #ifdef INET /* Make the compiler happy. */ laddr.s_addr = 0; - if ((inp->inp_vflag & INP_IPV4) != 0) { + if ((inp->inp_vflag & (INP_IPV4|INP_IPV6)) == INP_IPV4) { KASSERT(laddrp != NULL, ("%s: laddrp NULL for v4 inp %p", __func__, inp)); laddr = *laddrp; @@ -423,7 +423,7 @@ in_pcb_lport(struct inpcb *inp, struct in_addr *laddrp, u_short *lportp, } while (tmpinp != NULL); #ifdef INET - if ((inp->inp_vflag & INP_IPV4) != 0) + if ((inp->inp_vflag & (INP_IPV4|INP_IPV6)) == INP_IPV4) laddrp->s_addr = laddr.s_addr; #endif *lportp = lport; |