aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet6/sctp6_usrreq.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netinet6/sctp6_usrreq.c')
-rw-r--r--sys/netinet6/sctp6_usrreq.c84
1 files changed, 26 insertions, 58 deletions
diff --git a/sys/netinet6/sctp6_usrreq.c b/sys/netinet6/sctp6_usrreq.c
index 6c36e4899906..1268e4990e90 100644
--- a/sys/netinet6/sctp6_usrreq.c
+++ b/sys/netinet6/sctp6_usrreq.c
@@ -880,27 +880,21 @@ sctp6_connect(struct socket *so, struct sockaddr *addr, struct thread *p)
}
static int
-sctp6_getaddr(struct socket *so, struct sockaddr **addr)
+sctp6_getaddr(struct socket *so, struct sockaddr *sa)
{
- struct sockaddr_in6 *sin6;
+ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
struct sctp_inpcb *inp;
uint32_t vrf_id;
struct sctp_ifa *sctp_ifa;
-
int error;
- /*
- * Do the malloc first in case it blocks.
- */
- SCTP_MALLOC_SONAME(sin6, struct sockaddr_in6 *, sizeof(*sin6));
- if (sin6 == NULL)
- return (ENOMEM);
- sin6->sin6_family = AF_INET6;
- sin6->sin6_len = sizeof(*sin6);
+ *sin6 = (struct sockaddr_in6 ){
+ .sin6_len = sizeof(struct sockaddr_in6),
+ .sin6_family = AF_INET6,
+ };
inp = (struct sctp_inpcb *)so->so_pcb;
if (inp == NULL) {
- SCTP_FREE_SONAME(sin6);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, ECONNRESET);
return (ECONNRESET);
}
@@ -917,7 +911,6 @@ sctp6_getaddr(struct socket *so, struct sockaddr **addr)
stcb = LIST_FIRST(&inp->sctp_asoc_list);
if (stcb == NULL) {
SCTP_INP_RUNLOCK(inp);
- SCTP_FREE_SONAME(sin6);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, ENOENT);
return (ENOENT);
}
@@ -937,7 +930,6 @@ sctp6_getaddr(struct socket *so, struct sockaddr **addr)
if ((!fnd) || (sin_a6 == NULL)) {
/* punt */
SCTP_INP_RUNLOCK(inp);
- SCTP_FREE_SONAME(sin6);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, ENOENT);
return (ENOENT);
}
@@ -966,7 +958,6 @@ sctp6_getaddr(struct socket *so, struct sockaddr **addr)
}
}
if (!fnd) {
- SCTP_FREE_SONAME(sin6);
SCTP_INP_RUNLOCK(inp);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, ENOENT);
return (ENOENT);
@@ -975,17 +966,16 @@ sctp6_getaddr(struct socket *so, struct sockaddr **addr)
SCTP_INP_RUNLOCK(inp);
/* Scoping things for v6 */
if ((error = sa6_recoverscope(sin6)) != 0) {
- SCTP_FREE_SONAME(sin6);
return (error);
}
- (*addr) = (struct sockaddr *)sin6;
+
return (0);
}
static int
-sctp6_peeraddr(struct socket *so, struct sockaddr **addr)
+sctp6_peeraddr(struct socket *so, struct sockaddr *sa)
{
- struct sockaddr_in6 *sin6;
+ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
int fnd;
struct sockaddr_in6 *sin_a6;
struct sctp_inpcb *inp;
@@ -993,18 +983,15 @@ sctp6_peeraddr(struct socket *so, struct sockaddr **addr)
struct sctp_nets *net;
int error;
- /* Do the malloc first in case it blocks. */
- SCTP_MALLOC_SONAME(sin6, struct sockaddr_in6 *, sizeof *sin6);
- if (sin6 == NULL)
- return (ENOMEM);
- sin6->sin6_family = AF_INET6;
- sin6->sin6_len = sizeof(*sin6);
+ *sin6 = (struct sockaddr_in6 ){
+ .sin6_len = sizeof(struct sockaddr_in6),
+ .sin6_family = AF_INET6,
+ };
inp = (struct sctp_inpcb *)so->so_pcb;
if ((inp == NULL) ||
((inp->sctp_flags & SCTP_PCB_FLAGS_CONNECTED) == 0)) {
/* UDP type and listeners will drop out here */
- SCTP_FREE_SONAME(sin6);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, ENOTCONN);
return (ENOTCONN);
}
@@ -1015,7 +1002,6 @@ sctp6_peeraddr(struct socket *so, struct sockaddr **addr)
}
SCTP_INP_RUNLOCK(inp);
if (stcb == NULL) {
- SCTP_FREE_SONAME(sin6);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, ECONNRESET);
return (ECONNRESET);
}
@@ -1032,21 +1018,19 @@ sctp6_peeraddr(struct socket *so, struct sockaddr **addr)
SCTP_TCB_UNLOCK(stcb);
if (!fnd) {
/* No IPv4 address */
- SCTP_FREE_SONAME(sin6);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, ENOENT);
return (ENOENT);
}
if ((error = sa6_recoverscope(sin6)) != 0) {
- SCTP_FREE_SONAME(sin6);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP6_USRREQ, error);
return (error);
}
- *addr = (struct sockaddr *)sin6;
+
return (0);
}
static int
-sctp6_in6getaddr(struct socket *so, struct sockaddr **nam)
+sctp6_in6getaddr(struct socket *so, struct sockaddr *sa)
{
struct inpcb *inp = sotoinpcb(so);
int error;
@@ -1057,31 +1041,23 @@ sctp6_in6getaddr(struct socket *so, struct sockaddr **nam)
}
/* allow v6 addresses precedence */
- error = sctp6_getaddr(so, nam);
+ error = sctp6_getaddr(so, sa);
#ifdef INET
if (error) {
- struct sockaddr_in6 *sin6;
+ struct sockaddr_in sin;
/* try v4 next if v6 failed */
- error = sctp_ingetaddr(so, nam);
- if (error) {
+ error = sctp_ingetaddr(so, (struct sockaddr *)&sin);
+ if (error)
return (error);
- }
- SCTP_MALLOC_SONAME(sin6, struct sockaddr_in6 *, sizeof *sin6);
- if (sin6 == NULL) {
- SCTP_FREE_SONAME(*nam);
- return (ENOMEM);
- }
- in6_sin_2_v4mapsin6((struct sockaddr_in *)*nam, sin6);
- SCTP_FREE_SONAME(*nam);
- *nam = (struct sockaddr *)sin6;
+ in6_sin_2_v4mapsin6(&sin, (struct sockaddr_in6 *)sa);
}
#endif
return (error);
}
static int
-sctp6_getpeeraddr(struct socket *so, struct sockaddr **nam)
+sctp6_getpeeraddr(struct socket *so, struct sockaddr *sa)
{
struct inpcb *inp = sotoinpcb(so);
int error;
@@ -1092,24 +1068,16 @@ sctp6_getpeeraddr(struct socket *so, struct sockaddr **nam)
}
/* allow v6 addresses precedence */
- error = sctp6_peeraddr(so, nam);
+ error = sctp6_peeraddr(so, sa);
#ifdef INET
if (error) {
- struct sockaddr_in6 *sin6;
+ struct sockaddr_in sin;
/* try v4 next if v6 failed */
- error = sctp_peeraddr(so, nam);
- if (error) {
+ error = sctp_peeraddr(so, (struct sockaddr *)&sin);
+ if (error)
return (error);
- }
- SCTP_MALLOC_SONAME(sin6, struct sockaddr_in6 *, sizeof *sin6);
- if (sin6 == NULL) {
- SCTP_FREE_SONAME(*nam);
- return (ENOMEM);
- }
- in6_sin_2_v4mapsin6((struct sockaddr_in *)*nam, sin6);
- SCTP_FREE_SONAME(*nam);
- *nam = (struct sockaddr *)sin6;
+ in6_sin_2_v4mapsin6(&sin, (struct sockaddr_in6 *)sa);
}
#endif
return (error);