From db4fd95b0e68e13aefa8bc670e8ae6bf69afde58 Mon Sep 17 00:00:00 2001 From: Randall Stewart Date: Wed, 13 Jun 2007 14:39:41 +0000 Subject: [PATCH] - fix bindx to check addresses against socket's protocol family --- sys/netinet/sctputil.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/sys/netinet/sctputil.c b/sys/netinet/sctputil.c index b2f9f99ff53..b77733308ee 100644 --- a/sys/netinet/sctputil.c +++ b/sys/netinet/sctputil.c @@ -5906,8 +5906,19 @@ sctp_bindx_add_address(struct socket *so, struct sctp_inpcb *inp, *error = EINVAL; return; } + if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) == 0) { + /* can only bind v6 on PF_INET6 sockets */ + *error = EINVAL; + return; + } sin6 = (struct sockaddr_in6 *)addr_touse; if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && + SCTP_IPV6_V6ONLY(inp)) { + /* can't bind v4-mapped on PF_INET sockets */ + *error = EINVAL; + return; + } in6_sin6_2_sin(&sin, sin6); addr_touse = (struct sockaddr *)&sin; } @@ -5918,6 +5929,12 @@ sctp_bindx_add_address(struct socket *so, struct sctp_inpcb *inp, *error = EINVAL; return; } + if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && + SCTP_IPV6_V6ONLY(inp)) { + /* can't bind v4 on PF_INET sockets */ + *error = EINVAL; + return; + } } if (inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) { if (p == NULL) { @@ -5993,8 +6010,19 @@ sctp_bindx_delete_address(struct socket *so, struct sctp_inpcb *inp, *error = EINVAL; return; } + if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) == 0) { + /* can only bind v6 on PF_INET6 sockets */ + *error = EINVAL; + return; + } sin6 = (struct sockaddr_in6 *)addr_touse; if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) { + if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && + SCTP_IPV6_V6ONLY(inp)) { + /* can't bind mapped-v4 on PF_INET sockets */ + *error = EINVAL; + return; + } in6_sin6_2_sin(&sin, sin6); addr_touse = (struct sockaddr *)&sin; } @@ -6005,6 +6033,12 @@ sctp_bindx_delete_address(struct socket *so, struct sctp_inpcb *inp, *error = EINVAL; return; } + if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) && + SCTP_IPV6_V6ONLY(inp)) { + /* can't bind v4 on PF_INET sockets */ + *error = EINVAL; + return; + } } /* * No lock required mgmt_ep_sa does its own locking. If the FIX: