Merge branch 'master' of github.com:sctplab/usrsctp
diff --git a/usrsctplib/netinet/sctp_usrreq.c b/usrsctplib/netinet/sctp_usrreq.c
index a7ee7b1..7828698 100755
--- a/usrsctplib/netinet/sctp_usrreq.c
+++ b/usrsctplib/netinet/sctp_usrreq.c
@@ -34,7 +34,7 @@
 
 #if defined(__FreeBSD__) && !defined(__Userspace__)
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/sys/netinet/sctp_usrreq.c 362473 2020-06-21 23:12:56Z tuexen $");
+__FBSDID("$FreeBSD: head/sys/netinet/sctp_usrreq.c 362563 2020-06-23 23:05:05Z tuexen $");
 #endif
 
 #include <netinet/sctp_os.h>
@@ -1401,33 +1401,33 @@
  * returns 0 on success, 1 on error
  */
 static uint32_t
-sctp_fill_user_address(union sctp_sockstore *ss, struct sockaddr *sa)
+sctp_fill_user_address(struct sockaddr *dst, struct sockaddr *src)
 {
 #ifdef INET6
 #if defined(SCTP_EMBEDDED_V6_SCOPE)
 	struct sockaddr_in6 lsa6;
 
-	sa = (struct sockaddr *)sctp_recover_scope((struct sockaddr_in6 *)sa,
+	src = (struct sockaddr *)sctp_recover_scope((struct sockaddr_in6 *)src,
 	    &lsa6);
 #endif
 #endif
 #ifdef HAVE_SA_LEN
-	memcpy(ss, sa, sa->sa_len);
+	memcpy(dst, src, src->sa_len);
 #else
-	switch (sa->sa_family) {
+	switch (src->sa_family) {
 #ifdef INET
 	case AF_INET:
-		memcpy(ss, sa, sizeof(struct sockaddr_in));
+		memcpy(dst, src, sizeof(struct sockaddr_in));
 		break;
 #endif
 #ifdef INET6
 	case AF_INET6:
-		memcpy(ss, sa, sizeof(struct sockaddr_in6));
+		memcpy(dst, src, sizeof(struct sockaddr_in6));
 		break;
 #endif
 #if defined(__Userspace__)
 	case AF_CONN:
-		memcpy(ss, sa, sizeof(struct sockaddr_conn));
+		memcpy(dst, src, sizeof(struct sockaddr_conn));
 		break;
 #endif
 	default:
@@ -1447,7 +1447,7 @@
 sctp_fill_up_addresses_vrf(struct sctp_inpcb *inp,
                            struct sctp_tcb *stcb,
                            size_t limit,
-                           union sctp_sockstore *addr,
+                           struct sockaddr *addr,
                            uint32_t vrf_id)
 {
 	struct sctp_ifn *sctp_ifn;
@@ -1553,7 +1553,7 @@
 					 * is one of those we must skip it.
 					 */
 					if (sctp_is_addr_restricted(stcb,
-								    sctp_ifa)) {
+					                            sctp_ifa)) {
 						continue;
 					}
 				}
@@ -1586,9 +1586,9 @@
 							if (actual + sizeof(struct sockaddr_in6) > limit) {
 								return (actual);
 							}
-							in6_sin_2_v4mapsin6(sin, &addr->sin6);
-							addr->sin6.sin6_port = inp->sctp_lport;
-							addr = (union sctp_sockstore *)((caddr_t)addr + sizeof(struct sockaddr_in6));
+							in6_sin_2_v4mapsin6(sin, (struct sockaddr_in6 *)&addr);
+							((struct sockaddr_in6 *)addr)->sin6_port = inp->sctp_lport;
+							addr = (struct sockaddr *)((caddr_t)addr + sizeof(struct sockaddr_in6));
 							actual += sizeof(struct sockaddr_in6);
 						} else {
 #endif
@@ -1596,8 +1596,8 @@
 								return (actual);
 							}
 							memcpy(addr, sin, sizeof(struct sockaddr_in));
-							addr->sin.sin_port = inp->sctp_lport;
-							addr = (union sctp_sockstore *)((caddr_t)addr + sizeof(struct sockaddr_in));
+							((struct sockaddr_in *)addr)->sin_port = inp->sctp_lport;
+							addr = (struct sockaddr *)((caddr_t)addr + sizeof(struct sockaddr_in));
 							actual += sizeof(struct sockaddr_in);
 #ifdef INET6
 						}
@@ -1666,8 +1666,8 @@
 							return (actual);
 						}
 						memcpy(addr, sin6, sizeof(struct sockaddr_in6));
-						addr->sin6.sin6_port = inp->sctp_lport;
-						addr = (union sctp_sockstore *)((caddr_t)addr + sizeof(struct sockaddr_in6));
+						((struct sockaddr_in6 *)addr)->sin6_port = inp->sctp_lport;
+						addr = (struct sockaddr *)((caddr_t)addr + sizeof(struct sockaddr_in6));
 						actual += sizeof(struct sockaddr_in6);
 					} else {
 						continue;
@@ -1681,8 +1681,8 @@
 							return (actual);
 						}
 						memcpy(addr, &sctp_ifa->address.sconn, sizeof(struct sockaddr_conn));
-						addr->sconn.sconn_port = inp->sctp_lport;
-						addr = (union sctp_sockstore *)((caddr_t)addr + sizeof(struct sockaddr_conn));
+						((struct sockaddr_conn *)addr)->sconn_port = inp->sctp_lport;
+						addr = (struct sockaddr *)((caddr_t)addr + sizeof(struct sockaddr_conn));
 						actual += sizeof(struct sockaddr_conn);
 					} else {
 						continue;
@@ -1737,24 +1737,24 @@
 			switch (laddr->ifa->address.sa.sa_family) {
 #ifdef INET
 			case AF_INET:
-				addr->sin.sin_port = inp->sctp_lport;
+				((struct sockaddr_in *)addr)->sin_port = inp->sctp_lport;
 				break;
 #endif
 #ifdef INET6
 			case AF_INET6:
-				addr->sin6.sin6_port = inp->sctp_lport;
+				((struct sockaddr_in6 *)addr)->sin6_port = inp->sctp_lport;
 				break;
 #endif
 #if defined(__Userspace__)
 			case AF_CONN:
-				addr->sconn.sconn_port = inp->sctp_lport;
+				((struct sockaddr_conn *)addr)->sconn_port = inp->sctp_lport;
 				break;
 #endif
 			default:
 				/* TSNH */
 				break;
 			}
-			addr = (union sctp_sockstore *)((caddr_t)addr + sa_len);
+			addr = (struct sockaddr *)((caddr_t)addr + sa_len);
 			actual += sa_len;
 		}
 	}
@@ -1765,7 +1765,7 @@
 sctp_fill_up_addresses(struct sctp_inpcb *inp,
                        struct sctp_tcb *stcb,
                        size_t limit,
-                       union sctp_sockstore *addr)
+                       struct sockaddr *addr)
 {
 	size_t size = 0;
 #ifdef SCTP_MVRF
@@ -1782,7 +1782,7 @@
 	for (id = 0; (id < inp->num_vrfs) && (size < limit); id++) {
 		size += sctp_fill_up_addresses_vrf(inp, stcb, limit, addr,
 		                                   inp->m_vrf_ids[id]);
-		addr = (union sctp_sockstore *)((caddr_t)addr + size);
+		addr = (struct sockaddr *)((caddr_t)addr + size);
 	}
 #else
 	/* fill up addresses for the endpoint's default vrf */
@@ -2818,7 +2818,7 @@
 		 */
 	{
 		size_t cpsz, left;
-		union sctp_sockstore *addr;
+		struct sockaddr *addr;
 		struct sctp_nets *net;
 		struct sctp_getaddresses *saddr;
 
@@ -2828,7 +2828,7 @@
 		if (stcb) {
 			left = *optsize - offsetof(struct sctp_getaddresses, addr);
 			*optsize = offsetof(struct sctp_getaddresses, addr);
-			addr = &saddr->addr[0];
+			addr = &saddr->addr[0].sa;
 
 			TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
 				switch (net->ro._l_addr.sa.sa_family) {
@@ -2871,16 +2871,16 @@
 				    (net->ro._l_addr.sa.sa_family == AF_INET)) {
 					/* Must map the address */
 					in6_sin_2_v4mapsin6(&net->ro._l_addr.sin,
-					                    &addr->sin6);
+					                    (struct sockaddr_in6 *)&addr);
 				} else {
 					memcpy(addr, &net->ro._l_addr, cpsz);
 				}
 #else
 				memcpy(addr, &net->ro._l_addr, cpsz);
 #endif
-				addr->sin.sin_port = stcb->rport;
+				((struct sockaddr_in *)addr)->sin_port = stcb->rport;
 
-				addr = (union sctp_sockstore *)((caddr_t)addr + cpsz);
+				addr = (struct sockaddr *)((caddr_t)addr + cpsz);
 				left -= cpsz;
 				*optsize += cpsz;
 			}
@@ -2900,7 +2900,7 @@
 		SCTP_FIND_STCB(inp, stcb, saddr->sget_assoc_id);
 
 		limit = *optsize - offsetof(struct sctp_getaddresses, addr);
-		actual = sctp_fill_up_addresses(inp, stcb, limit, saddr->addr);
+		actual = sctp_fill_up_addresses(inp, stcb, limit, &saddr->addr[0].sa);
 		if (stcb) {
 			SCTP_TCB_UNLOCK(stcb);
 		}