summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbz <bz@FreeBSD.org>2011-03-19 19:08:54 +0000
committerbz <bz@FreeBSD.org>2011-03-19 19:08:54 +0000
commit7b8d9ca423a772ee3a8a1f00b0087f7b6e52f53b (patch)
treed4d74c2013c8f1d9bf4b3a01ebc1dd7ca80aef06
parent9dffdca01d441bda85751cdc8103689208630bae (diff)
downloadFreeBSD-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
-rw-r--r--sys/netinet/in_pcb.c4
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;
OpenPOWER on IntegriCloud