Fix alignment issue manifesting in the userland stack.

MFC after:		1 wwek
This commit is contained in:
Michael Tuexen 2020-06-23 23:05:05 +00:00
parent 158c55a584
commit 87c0bf77d9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=362563

View File

@ -989,15 +989,15 @@ sctp_shutdown(struct socket *so)
* 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
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
memcpy(ss, sa, sa->sa_len);
memcpy(dst, src, src->sa_len);
return (0);
}
@ -1010,7 +1010,7 @@ static size_t
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;
@ -1125,9 +1125,9 @@ sctp_fill_up_addresses_vrf(struct sctp_inpcb *inp,
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
@ -1135,8 +1135,8 @@ sctp_fill_up_addresses_vrf(struct sctp_inpcb *inp,
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
}
@ -1189,8 +1189,8 @@ sctp_fill_up_addresses_vrf(struct sctp_inpcb *inp,
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;
@ -1222,19 +1222,19 @@ sctp_fill_up_addresses_vrf(struct sctp_inpcb *inp,
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
default:
/* TSNH */
break;
}
addr = (union sctp_sockstore *)((caddr_t)addr + sa_len);
addr = (struct sockaddr *)((caddr_t)addr + sa_len);
actual += sa_len;
}
}
@ -1245,7 +1245,7 @@ static size_t
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;
@ -2226,7 +2226,7 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
*/
{
size_t cpsz, left;
union sctp_sockstore *addr;
struct sockaddr *addr;
struct sctp_nets *net;
struct sctp_getaddresses *saddr;
@ -2236,7 +2236,7 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
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) {
@ -2274,16 +2274,16 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
(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;
}
@ -2303,7 +2303,7 @@ sctp_getopt(struct socket *so, int optname, void *optval, size_t *optsize,
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);
}