Page MenuHomeFreeBSD

D42694.diff
No OneTemporary

D42694.diff

diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c
--- a/sys/compat/linux/linux_socket.c
+++ b/sys/compat/linux/linux_socket.c
@@ -1106,48 +1106,50 @@
int
linux_getsockname(struct thread *td, struct linux_getsockname_args *args)
{
- struct sockaddr *sa;
- int len, error;
+ struct sockaddr_storage ss = { .ss_len = sizeof(ss) };
+ socklen_t len;
+ int error;
error = copyin(PTRIN(args->namelen), &len, sizeof(len));
if (error != 0)
return (error);
- error = kern_getsockname(td, args->s, &sa, &len);
+ error = kern_getsockname(td, args->s, (struct sockaddr *)&ss);
if (error != 0)
return (error);
- if (len != 0)
- error = linux_copyout_sockaddr(sa, PTRIN(args->addr), len);
-
- free(sa, M_SONAME);
- if (error == 0)
+ len = min(ss.ss_len, len);
+ error = linux_copyout_sockaddr((struct sockaddr *)&ss,
+ PTRIN(args->addr), len);
+ if (error == 0) {
+ len = ss.ss_len;
error = copyout(&len, PTRIN(args->namelen), sizeof(len));
+ }
return (error);
}
int
linux_getpeername(struct thread *td, struct linux_getpeername_args *args)
{
- struct sockaddr *sa;
- int len, error;
+ struct sockaddr_storage ss = { .ss_len = sizeof(ss) };
+ socklen_t len;
+ int error;
error = copyin(PTRIN(args->namelen), &len, sizeof(len));
if (error != 0)
return (error);
- if (len < 0)
- return (EINVAL);
- error = kern_getpeername(td, args->s, &sa, &len);
+ error = kern_getpeername(td, args->s, (struct sockaddr *)&ss);
if (error != 0)
return (error);
- if (len != 0)
- error = linux_copyout_sockaddr(sa, PTRIN(args->addr), len);
-
- free(sa, M_SONAME);
- if (error == 0)
+ len = min(ss.ss_len, len);
+ error = linux_copyout_sockaddr((struct sockaddr *)&ss,
+ PTRIN(args->addr), len);
+ if (error == 0) {
+ len = ss.ss_len;
error = copyout(&len, PTRIN(args->namelen), sizeof(len));
+ }
return (error);
}
@@ -1348,6 +1350,7 @@
linux_sendmsg_common(struct thread *td, l_int s, struct l_msghdr *msghdr,
l_uint flags)
{
+ struct sockaddr_storage ss = { .ss_len = sizeof(ss) };
struct cmsghdr *cmsg;
struct mbuf *control;
struct msghdr msg;
@@ -1356,7 +1359,6 @@
struct l_msghdr linux_msghdr;
struct iovec *iov;
socklen_t datalen;
- struct sockaddr *sa;
struct socket *so;
sa_family_t sa_family;
struct file *fp;
@@ -1395,11 +1397,10 @@
control = NULL;
- error = kern_getsockname(td, s, &sa, &datalen);
+ error = kern_getsockname(td, s, (struct sockaddr *)&ss);
if (error != 0)
goto bad;
- sa_family = sa->sa_family;
- free(sa, M_SONAME);
+ sa_family = ss.ss_family;
if (flags & LINUX_MSG_OOB) {
error = EOPNOTSUPP;
diff --git a/sys/compat/linuxkpi/common/include/linux/net.h b/sys/compat/linuxkpi/common/include/linux/net.h
--- a/sys/compat/linuxkpi/common/include/linux/net.h
+++ b/sys/compat/linuxkpi/common/include/linux/net.h
@@ -45,26 +45,27 @@
}
static inline int
-sock_getname(struct socket *so, struct sockaddr *addr, int *sockaddr_len,
+sock_getname(struct socket *so, struct sockaddr *sa, int *sockaddr_len,
int peer)
{
- struct sockaddr *nam;
int error;
- nam = NULL;
+ /*
+ * XXXGL: we can't use sopeeraddr()/sosockaddr() here since with
+ * INVARIANTS they would check if supplied sockaddr has enough
+ * length. Such notion doesn't even exist in Linux KPI.
+ */
if (peer) {
if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0)
return (-ENOTCONN);
- error = so->so_proto->pr_peeraddr(so, &nam);
+ error = so->so_proto->pr_peeraddr(so, sa);
} else
- error = so->so_proto->pr_sockaddr(so, &nam);
+ error = so->so_proto->pr_sockaddr(so, sa);
if (error)
return (-error);
- *addr = *nam;
- *sockaddr_len = addr->sa_len;
+ *sockaddr_len = sa->sa_len;
- free(nam, M_SONAME);
return (0);
}
diff --git a/sys/dev/cxgbe/iw_cxgbe/cm.c b/sys/dev/cxgbe/iw_cxgbe/cm.c
--- a/sys/dev/cxgbe/iw_cxgbe/cm.c
+++ b/sys/dev/cxgbe/iw_cxgbe/cm.c
@@ -145,30 +145,24 @@
#define GET_LOCAL_ADDR(pladdr, so) \
do { \
- struct sockaddr_storage *__a = NULL; \
struct inpcb *__inp = sotoinpcb(so); \
KASSERT(__inp != NULL, \
("GET_LOCAL_ADDR(%s):so:%p, inp = NULL", __func__, so)); \
if (__inp->inp_vflag & INP_IPV4) \
- in_getsockaddr(so, (struct sockaddr **)&__a); \
+ in_getsockaddr(so, (struct sockaddr *)pladdr); \
else \
- in6_getsockaddr(so, (struct sockaddr **)&__a); \
- *(pladdr) = *__a; \
- free(__a, M_SONAME); \
+ in6_getsockaddr(so, (struct sockaddr *)pladdr); \
} while (0)
#define GET_REMOTE_ADDR(praddr, so) \
do { \
- struct sockaddr_storage *__a = NULL; \
struct inpcb *__inp = sotoinpcb(so); \
KASSERT(__inp != NULL, \
("GET_REMOTE_ADDR(%s):so:%p, inp = NULL", __func__, so)); \
if (__inp->inp_vflag & INP_IPV4) \
- in_getpeeraddr(so, (struct sockaddr **)&__a); \
+ in_getpeeraddr(so, (struct sockaddr *)praddr); \
else \
- in6_getpeeraddr(so, (struct sockaddr **)&__a); \
- *(praddr) = *__a; \
- free(__a, M_SONAME); \
+ in6_getpeeraddr(so, (struct sockaddr *)praddr); \
} while (0)
static char *states[] = {
diff --git a/sys/dev/hyperv/hvsock/hv_sock.h b/sys/dev/hyperv/hvsock/hv_sock.h
--- a/sys/dev/hyperv/hvsock/hv_sock.h
+++ b/sys/dev/hyperv/hvsock/hv_sock.h
@@ -103,8 +103,8 @@
int hvs_trans_accept(struct socket *, struct sockaddr *);
int hvs_trans_connect(struct socket *,
struct sockaddr *, struct thread *);
-int hvs_trans_peeraddr(struct socket *, struct sockaddr **);
-int hvs_trans_sockaddr(struct socket *, struct sockaddr **);
+int hvs_trans_peeraddr(struct socket *, struct sockaddr *);
+int hvs_trans_sockaddr(struct socket *, struct sockaddr *);
int hvs_trans_soreceive(struct socket *, struct sockaddr **,
struct uio *, struct mbuf **, struct mbuf **, int *);
int hvs_trans_sosend(struct socket *, struct sockaddr *, struct uio *,
diff --git a/sys/dev/hyperv/hvsock/hv_sock.c b/sys/dev/hyperv/hvsock/hv_sock.c
--- a/sys/dev/hyperv/hvsock/hv_sock.c
+++ b/sys/dev/hyperv/hvsock/hv_sock.c
@@ -876,7 +876,7 @@
}
int
-hvs_trans_peeraddr(struct socket *so, struct sockaddr **nam)
+hvs_trans_peeraddr(struct socket *so, struct sockaddr *sa)
{
struct hvs_pcb *pcb = so2hvspcb(so);
@@ -886,13 +886,13 @@
if (pcb == NULL)
return (EINVAL);
- *nam = sodupsockaddr((struct sockaddr *) &pcb->remote_addr, M_NOWAIT);
+ memcpy(sa, &pcb->remote_addr, pcb->remote_addr.sa_len);
- return ((*nam == NULL)? ENOMEM : 0);
+ return (0);
}
int
-hvs_trans_sockaddr(struct socket *so, struct sockaddr **nam)
+hvs_trans_sockaddr(struct socket *so, struct sockaddr *sa)
{
struct hvs_pcb *pcb = so2hvspcb(so);
@@ -902,9 +902,9 @@
if (pcb == NULL)
return (EINVAL);
- *nam = sodupsockaddr((struct sockaddr *) &pcb->local_addr, M_NOWAIT);
+ memcpy(sa, &pcb->local_addr, pcb->local_addr.sa_len);
- return ((*nam == NULL)? ENOMEM : 0);
+ return (0);
}
void
diff --git a/sys/dev/wg/if_wg.c b/sys/dev/wg/if_wg.c
--- a/sys/dev/wg/if_wg.c
+++ b/sys/dev/wg/if_wg.c
@@ -806,14 +806,15 @@
if (ret4 && ret4 != EADDRNOTAVAIL)
return (ret4);
if (!ret4 && !sin.sin_port) {
- struct sockaddr_in *bound_sin;
- int ret = so4->so_proto->pr_sockaddr(so4,
- (struct sockaddr **)&bound_sin);
+ struct sockaddr_in bound_sin =
+ { .sin_len = sizeof(bound_sin) };
+ int ret;
+
+ ret = sosockaddr(so4, (struct sockaddr *)&bound_sin);
if (ret)
return (ret);
- port = ntohs(bound_sin->sin_port);
- sin6.sin6_port = bound_sin->sin_port;
- free(bound_sin, M_SONAME);
+ port = ntohs(bound_sin.sin_port);
+ sin6.sin6_port = bound_sin.sin_port;
}
}
@@ -822,13 +823,14 @@
if (ret6 && ret6 != EADDRNOTAVAIL)
return (ret6);
if (!ret6 && !sin6.sin6_port) {
- struct sockaddr_in6 *bound_sin6;
- int ret = so6->so_proto->pr_sockaddr(so6,
- (struct sockaddr **)&bound_sin6);
+ struct sockaddr_in6 bound_sin6 =
+ { .sin6_len = sizeof(bound_sin6) };
+ int ret;
+
+ ret = sosockaddr(so6, (struct sockaddr *)&bound_sin6);
if (ret)
return (ret);
- port = ntohs(bound_sin6->sin6_port);
- free(bound_sin6, M_SONAME);
+ port = ntohs(bound_sin6.sin6_port);
}
}
diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c
--- a/sys/kern/sys_socket.c
+++ b/sys/kern/sys_socket.c
@@ -355,7 +355,7 @@
static int
soo_fill_kinfo(struct file *fp, struct kinfo_file *kif, struct filedesc *fdp)
{
- struct sockaddr *sa;
+ struct sockaddr_storage ss = { .ss_len = sizeof(ss) };
struct inpcb *inpcb;
struct unpcb *unpcb;
struct socket *so;
@@ -404,17 +404,16 @@
}
break;
}
- error = so->so_proto->pr_sockaddr(so, &sa);
+ error = sosockaddr(so, (struct sockaddr *)&ss);
if (error == 0 &&
- sa->sa_len <= sizeof(kif->kf_un.kf_sock.kf_sa_local)) {
- bcopy(sa, &kif->kf_un.kf_sock.kf_sa_local, sa->sa_len);
- free(sa, M_SONAME);
+ ss.ss_len <= sizeof(kif->kf_un.kf_sock.kf_sa_local)) {
+ bcopy(&ss, &kif->kf_un.kf_sock.kf_sa_local, ss.ss_len);
}
- error = so->so_proto->pr_peeraddr(so, &sa);
+ ss.ss_len = sizeof(ss);
+ error = sopeeraddr(so, (struct sockaddr *)&ss);
if (error == 0 &&
- sa->sa_len <= sizeof(kif->kf_un.kf_sock.kf_sa_peer)) {
- bcopy(sa, &kif->kf_un.kf_sock.kf_sa_peer, sa->sa_len);
- free(sa, M_SONAME);
+ ss.ss_len <= sizeof(kif->kf_un.kf_sock.kf_sa_peer)) {
+ bcopy(&ss, &kif->kf_un.kf_sock.kf_sa_peer, ss.ss_len);
}
strncpy(kif->kf_path, so->so_proto->pr_domain->dom_name,
sizeof(kif->kf_path));
diff --git a/sys/kern/uipc_domain.c b/sys/kern/uipc_domain.c
--- a/sys/kern/uipc_domain.c
+++ b/sys/kern/uipc_domain.c
@@ -116,7 +116,7 @@
}
static int
-pr_peeraddr_notsupp(struct socket *so, struct sockaddr **nam)
+pr_peeraddr_notsupp(struct socket *so, struct sockaddr *nam)
{
return (EOPNOTSUPP);
}
@@ -157,7 +157,7 @@
}
static int
-pr_sockaddr_notsupp(struct socket *so, struct sockaddr **nam)
+pr_sockaddr_notsupp(struct socket *so, struct sockaddr *nam)
{
return (EOPNOTSUPP);
}
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -1363,6 +1363,40 @@
return (error);
}
+int
+sopeeraddr(struct socket *so, struct sockaddr *sa)
+{
+#ifdef INVARIANTS
+ u_char len = sa->sa_len;
+#endif
+ int error;
+
+ CURVNET_SET(so->so_vnet);
+ error = so->so_proto->pr_peeraddr(so, sa);
+ KASSERT(sa->sa_len <= len,
+ ("%s: protocol %p sockaddr overflow", __func__, so->so_proto));
+ CURVNET_RESTORE();
+
+ return (error);
+}
+
+int
+sosockaddr(struct socket *so, struct sockaddr *sa)
+{
+#ifdef INVARIANTS
+ u_char len = sa->sa_len;
+#endif
+ int error;
+
+ CURVNET_SET(so->so_vnet);
+ error = so->so_proto->pr_sockaddr(so, sa);
+ KASSERT(sa->sa_len <= len,
+ ("%s: protocol %p sockaddr overflow", __func__, so->so_proto));
+ CURVNET_RESTORE();
+
+ return (error);
+}
+
int
soconnect(struct socket *so, struct sockaddr *nam, struct thread *td)
{
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -1308,7 +1308,7 @@
user_getsockname(struct thread *td, int fdes, struct sockaddr *asa,
socklen_t *alen, bool compat)
{
- struct sockaddr *sa;
+ struct sockaddr_storage ss = { .ss_len = sizeof(ss) };
socklen_t len;
int error;
@@ -1316,30 +1316,28 @@
if (error != 0)
return (error);
- error = kern_getsockname(td, fdes, &sa, &len);
+ error = kern_getsockname(td, fdes, (struct sockaddr *)&ss);
if (error != 0)
return (error);
- if (len != 0) {
#ifdef COMPAT_OLDSOCK
- if (compat && SV_PROC_FLAG(td->td_proc, SV_AOUT))
- ((struct osockaddr *)sa)->sa_family = sa->sa_family;
+ if (compat && SV_PROC_FLAG(td->td_proc, SV_AOUT))
+ ((struct osockaddr *)&ss)->sa_family = ss.ss_family;
#endif
- error = copyout(sa, asa, len);
- }
- free(sa, M_SONAME);
- if (error == 0)
+ len = min(ss.ss_len, len);
+ error = copyout(&ss, asa, len);
+ if (error == 0) {
+ len = ss.ss_len;
error = copyout(&len, alen, sizeof(len));
+ }
return (error);
}
int
-kern_getsockname(struct thread *td, int fd, struct sockaddr **sa,
- socklen_t *alen)
+kern_getsockname(struct thread *td, int fd, struct sockaddr *sa)
{
struct socket *so;
struct file *fp;
- socklen_t len;
int error;
AUDIT_ARG_FD(fd);
@@ -1347,27 +1345,12 @@
if (error != 0)
return (error);
so = fp->f_data;
- *sa = NULL;
- CURVNET_SET(so->so_vnet);
- error = so->so_proto->pr_sockaddr(so, sa);
- CURVNET_RESTORE();
- if (error != 0)
- goto bad;
- if (*sa == NULL)
- len = 0;
- else
- len = MIN(*alen, (*sa)->sa_len);
- *alen = len;
+ error = sosockaddr(so, sa);
#ifdef KTRACE
- if (KTRPOINT(td, KTR_STRUCT))
- ktrsockaddr(*sa);
+ if (error == 0 && KTRPOINT(td, KTR_STRUCT))
+ ktrsockaddr(sa);
#endif
-bad:
fdrop(fp, td);
- if (error != 0 && *sa != NULL) {
- free(*sa, M_SONAME);
- *sa = NULL;
- }
return (error);
}
@@ -1389,7 +1372,7 @@
user_getpeername(struct thread *td, int fdes, struct sockaddr *asa,
socklen_t *alen, bool compat)
{
- struct sockaddr *sa;
+ struct sockaddr_storage ss = { .ss_len = sizeof(ss) };
socklen_t len;
int error;
@@ -1397,30 +1380,28 @@
if (error != 0)
return (error);
- error = kern_getpeername(td, fdes, &sa, &len);
+ error = kern_getpeername(td, fdes, (struct sockaddr *)&ss);
if (error != 0)
return (error);
- if (len != 0) {
#ifdef COMPAT_OLDSOCK
- if (compat && SV_PROC_FLAG(td->td_proc, SV_AOUT))
- ((struct osockaddr *)sa)->sa_family = sa->sa_family;
+ if (compat && SV_PROC_FLAG(td->td_proc, SV_AOUT))
+ ((struct osockaddr *)&ss)->sa_family = ss.ss_family;
#endif
- error = copyout(sa, asa, len);
- }
- free(sa, M_SONAME);
- if (error == 0)
+ len = min(ss.ss_len, len);
+ error = copyout(&ss, asa, len);
+ if (error == 0) {
+ len = ss.ss_len;
error = copyout(&len, alen, sizeof(len));
+ }
return (error);
}
int
-kern_getpeername(struct thread *td, int fd, struct sockaddr **sa,
- socklen_t *alen)
+kern_getpeername(struct thread *td, int fd, struct sockaddr *sa)
{
struct socket *so;
struct file *fp;
- socklen_t len;
int error;
AUDIT_ARG_FD(fd);
@@ -1432,26 +1413,11 @@
error = ENOTCONN;
goto done;
}
- *sa = NULL;
- CURVNET_SET(so->so_vnet);
- error = so->so_proto->pr_peeraddr(so, sa);
- CURVNET_RESTORE();
- if (error != 0)
- goto bad;
- if (*sa == NULL)
- len = 0;
- else
- len = MIN(*alen, (*sa)->sa_len);
- *alen = len;
+ error = sopeeraddr(so, sa);
#ifdef KTRACE
- if (KTRPOINT(td, KTR_STRUCT))
- ktrsockaddr(*sa);
+ if (error == 0 && KTRPOINT(td, KTR_STRUCT))
+ ktrsockaddr(sa);
#endif
-bad:
- if (error != 0 && *sa != NULL) {
- free(*sa, M_SONAME);
- *sa = NULL;
- }
done:
fdrop(fp, td);
return (error);
diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c
--- a/sys/kern/uipc_usrreq.c
+++ b/sys/kern/uipc_usrreq.c
@@ -436,33 +436,6 @@
UNP_PCB_UNLOCK(unp);
}
-static int
-uipc_accept(struct socket *so, struct sockaddr *ret)
-{
- struct unpcb *unp, *unp2;
- const struct sockaddr *sa;
-
- /*
- * Pass back name of connected socket, if it was bound and we are
- * still connected (our peer may have closed already!).
- */
- unp = sotounpcb(so);
- KASSERT(unp != NULL, ("uipc_accept: unp == NULL"));
-
- UNP_PCB_LOCK(unp);
- unp2 = unp_pcb_lock_peer(unp);
- if (unp2 != NULL && unp2->unp_addr != NULL)
- sa = (struct sockaddr *)unp2->unp_addr;
- else
- sa = &sun_noname;
- bcopy(sa, ret, sa->sa_len);
- if (unp2 != NULL)
- unp_pcb_unlock_pair(unp, unp2);
- else
- UNP_PCB_UNLOCK(unp);
- return (0);
-}
-
static int
uipc_attach(struct socket *so, int proto, struct thread *td)
{
@@ -874,7 +847,7 @@
}
static int
-uipc_peeraddr(struct socket *so, struct sockaddr **nam)
+uipc_peeraddr(struct socket *so, struct sockaddr *ret)
{
struct unpcb *unp, *unp2;
const struct sockaddr *sa;
@@ -882,8 +855,6 @@
unp = sotounpcb(so);
KASSERT(unp != NULL, ("uipc_peeraddr: unp == NULL"));
- *nam = malloc(sizeof(struct sockaddr_un), M_SONAME, M_WAITOK);
-
UNP_PCB_LOCK(unp);
unp2 = unp_pcb_lock_peer(unp);
if (unp2 != NULL) {
@@ -891,12 +862,12 @@
sa = (struct sockaddr *)unp2->unp_addr;
else
sa = &sun_noname;
- bcopy(sa, *nam, sa->sa_len);
+ bcopy(sa, ret, sa->sa_len);
unp_pcb_unlock_pair(unp, unp2);
} else {
- sa = &sun_noname;
- bcopy(sa, *nam, sa->sa_len);
UNP_PCB_UNLOCK(unp);
+ sa = &sun_noname;
+ bcopy(sa, ret, sa->sa_len);
}
return (0);
}
@@ -1704,7 +1675,7 @@
}
static int
-uipc_sockaddr(struct socket *so, struct sockaddr **nam)
+uipc_sockaddr(struct socket *so, struct sockaddr *ret)
{
struct unpcb *unp;
const struct sockaddr *sa;
@@ -1712,13 +1683,12 @@
unp = sotounpcb(so);
KASSERT(unp != NULL, ("uipc_sockaddr: unp == NULL"));
- *nam = malloc(sizeof(struct sockaddr_un), M_SONAME, M_WAITOK);
UNP_PCB_LOCK(unp);
if (unp->unp_addr != NULL)
sa = (struct sockaddr *) unp->unp_addr;
else
sa = &sun_noname;
- bcopy(sa, *nam, sa->sa_len);
+ bcopy(sa, ret, sa->sa_len);
UNP_PCB_UNLOCK(unp);
return (0);
}
@@ -3322,7 +3292,7 @@
PR_CAPATTACH,
.pr_ctloutput = &uipc_ctloutput,
.pr_abort = uipc_abort,
- .pr_accept = uipc_accept,
+ .pr_accept = uipc_peeraddr,
.pr_attach = uipc_attach,
.pr_bind = uipc_bind,
.pr_bindat = uipc_bindat,
@@ -3349,7 +3319,7 @@
PR_SOCKBUF,
.pr_ctloutput = &uipc_ctloutput,
.pr_abort = uipc_abort,
- .pr_accept = uipc_accept,
+ .pr_accept = uipc_peeraddr,
.pr_attach = uipc_attach,
.pr_bind = uipc_bind,
.pr_bindat = uipc_bindat,
@@ -3378,7 +3348,7 @@
PR_WANTRCVD|PR_RIGHTS|PR_CAPATTACH,
.pr_ctloutput = &uipc_ctloutput,
.pr_abort = uipc_abort,
- .pr_accept = uipc_accept,
+ .pr_accept = uipc_peeraddr,
.pr_attach = uipc_attach,
.pr_bind = uipc_bind,
.pr_bindat = uipc_bindat,
diff --git a/sys/net/if_ovpn.c b/sys/net/if_ovpn.c
--- a/sys/net/if_ovpn.c
+++ b/sys/net/if_ovpn.c
@@ -508,7 +508,6 @@
struct sockaddr_storage remote;
struct ovpn_kpeer *peer = NULL;
struct file *fp = NULL;
- struct sockaddr *name = NULL;
struct ovpn_softc *sc = ifp->if_softc;
struct thread *td = curthread;
struct socket *so = NULL;
@@ -574,23 +573,21 @@
callout_init_rm(&peer->ping_send, &sc->lock, CALLOUT_SHAREDLOCK);
callout_init_rm(&peer->ping_rcv, &sc->lock, 0);
- ret = so->so_proto->pr_sockaddr(so, &name);
+ peer->local.ss_len = sizeof(peer->local);
+ ret = sosockaddr(so, (struct sockaddr *)&peer->local);
if (ret)
goto error;
- if (ovpn_get_port((struct sockaddr_storage *)name) == 0) {
+ if (ovpn_get_port(&peer->local) == 0) {
ret = EINVAL;
goto error;
}
- if (name->sa_family != remote.ss_family) {
+ if (peer->local.ss_family != remote.ss_family) {
ret = EINVAL;
goto error;
}
- memcpy(&peer->local, name, name->sa_len);
memcpy(&peer->remote, &remote, sizeof(remote));
- free(name, M_SONAME);
- name = NULL;
if (peer->local.ss_family == AF_INET6 &&
IN6_IS_ADDR_V4MAPPED(&TO_IN6(&peer->remote)->sin6_addr)) {
@@ -656,7 +653,6 @@
error_locked:
OVPN_WUNLOCK(sc);
error:
- free(name, M_SONAME);
COUNTER_ARRAY_FREE(peer->counters, OVPN_PEER_COUNTER_SIZE);
uma_zfree_pcpu(pcpu_zone_4, peer->last_active);
free(peer, M_OVPN);
diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h b/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h
--- a/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h
+++ b/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h
@@ -78,11 +78,10 @@
int ng_btsocket_hci_raw_ctloutput (struct socket *, struct sockopt *);
void ng_btsocket_hci_raw_detach (struct socket *);
int ng_btsocket_hci_raw_disconnect (struct socket *);
-int ng_btsocket_hci_raw_peeraddr (struct socket *, struct sockaddr **);
int ng_btsocket_hci_raw_send (struct socket *, int, struct mbuf *,
struct sockaddr *, struct mbuf *,
struct thread *);
-int ng_btsocket_hci_raw_sockaddr (struct socket *, struct sockaddr **);
+int ng_btsocket_hci_raw_sockaddr (struct socket *, struct sockaddr *);
#endif /* _KERNEL */
diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h b/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h
--- a/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h
+++ b/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h
@@ -105,11 +105,11 @@
struct ifnet *, struct thread *);
void ng_btsocket_l2cap_raw_detach (struct socket *);
int ng_btsocket_l2cap_raw_disconnect (struct socket *);
-int ng_btsocket_l2cap_raw_peeraddr (struct socket *, struct sockaddr **);
+int ng_btsocket_l2cap_raw_peeraddr (struct socket *, struct sockaddr *);
int ng_btsocket_l2cap_raw_send (struct socket *, int, struct mbuf *,
struct sockaddr *, struct mbuf *,
struct thread *);
-int ng_btsocket_l2cap_raw_sockaddr (struct socket *, struct sockaddr **);
+int ng_btsocket_l2cap_raw_sockaddr (struct socket *, struct sockaddr *);
#endif /* _KERNEL */
@@ -191,7 +191,6 @@
void ng_btsocket_l2cap_abort (struct socket *);
void ng_btsocket_l2cap_close (struct socket *);
-int ng_btsocket_l2cap_accept (struct socket *, struct sockaddr *);
int ng_btsocket_l2cap_attach (struct socket *, int, struct thread *);
int ng_btsocket_l2cap_bind (struct socket *, struct sockaddr *,
struct thread *);
@@ -203,11 +202,11 @@
void ng_btsocket_l2cap_detach (struct socket *);
int ng_btsocket_l2cap_disconnect (struct socket *);
int ng_btsocket_l2cap_listen (struct socket *, int, struct thread *);
-int ng_btsocket_l2cap_peeraddr (struct socket *, struct sockaddr **);
+int ng_btsocket_l2cap_peeraddr (struct socket *, struct sockaddr *);
int ng_btsocket_l2cap_send (struct socket *, int, struct mbuf *,
struct sockaddr *, struct mbuf *,
struct thread *);
-int ng_btsocket_l2cap_sockaddr (struct socket *, struct sockaddr **);
+int ng_btsocket_l2cap_sockaddr (struct socket *, struct sockaddr *);
#endif /* _KERNEL */
diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h b/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h
--- a/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h
+++ b/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h
@@ -328,11 +328,11 @@
void ng_btsocket_rfcomm_detach (struct socket *);
int ng_btsocket_rfcomm_disconnect (struct socket *);
int ng_btsocket_rfcomm_listen (struct socket *, int, struct thread *);
-int ng_btsocket_rfcomm_peeraddr (struct socket *, struct sockaddr **);
+int ng_btsocket_rfcomm_peeraddr (struct socket *, struct sockaddr *);
int ng_btsocket_rfcomm_send (struct socket *, int, struct mbuf *,
struct sockaddr *, struct mbuf *,
struct thread *);
-int ng_btsocket_rfcomm_sockaddr (struct socket *, struct sockaddr **);
+int ng_btsocket_rfcomm_sockaddr (struct socket *, struct sockaddr *);
#endif /* _KERNEL */
diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_sco.h b/sys/netgraph/bluetooth/include/ng_btsocket_sco.h
--- a/sys/netgraph/bluetooth/include/ng_btsocket_sco.h
+++ b/sys/netgraph/bluetooth/include/ng_btsocket_sco.h
@@ -118,11 +118,11 @@
void ng_btsocket_sco_detach (struct socket *);
int ng_btsocket_sco_disconnect (struct socket *);
int ng_btsocket_sco_listen (struct socket *, int, struct thread *);
-int ng_btsocket_sco_peeraddr (struct socket *, struct sockaddr **);
+int ng_btsocket_sco_peeraddr (struct socket *, struct sockaddr *);
int ng_btsocket_sco_send (struct socket *, int, struct mbuf *,
struct sockaddr *, struct mbuf *,
struct thread *);
-int ng_btsocket_sco_sockaddr (struct socket *, struct sockaddr **);
+int ng_btsocket_sco_sockaddr (struct socket *, struct sockaddr *);
#endif /* _KERNEL */
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket.c b/sys/netgraph/bluetooth/socket/ng_btsocket.c
--- a/sys/netgraph/bluetooth/socket/ng_btsocket.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket.c
@@ -79,7 +79,7 @@
.pr_control = ng_btsocket_hci_raw_control,
.pr_detach = ng_btsocket_hci_raw_detach,
.pr_disconnect = ng_btsocket_hci_raw_disconnect,
- .pr_peeraddr = ng_btsocket_hci_raw_peeraddr,
+ .pr_peeraddr = ng_btsocket_hci_raw_sockaddr,
.pr_send = ng_btsocket_hci_raw_send,
.pr_sockaddr = ng_btsocket_hci_raw_sockaddr,
.pr_close = ng_btsocket_hci_raw_close,
@@ -110,7 +110,7 @@
.pr_flags = PR_ATOMIC|PR_CONNREQUIRED,
.pr_ctloutput = ng_btsocket_l2cap_ctloutput,
.pr_abort = ng_btsocket_l2cap_abort,
- .pr_accept = ng_btsocket_l2cap_accept,
+ .pr_accept = ng_btsocket_l2cap_peeraddr,
.pr_attach = ng_btsocket_l2cap_attach,
.pr_bind = ng_btsocket_l2cap_bind,
.pr_connect = ng_btsocket_l2cap_connect,
@@ -131,7 +131,7 @@
.pr_flags = PR_CONNREQUIRED,
.pr_ctloutput = ng_btsocket_rfcomm_ctloutput,
.pr_abort = ng_btsocket_rfcomm_abort,
- .pr_accept = ng_btsocket_rfcomm_accept,
+ .pr_accept = ng_btsocket_rfcomm_peeraddr,
.pr_attach = ng_btsocket_rfcomm_attach,
.pr_bind = ng_btsocket_rfcomm_bind,
.pr_connect = ng_btsocket_rfcomm_connect,
@@ -152,7 +152,7 @@
.pr_flags = PR_ATOMIC|PR_CONNREQUIRED,
.pr_ctloutput = ng_btsocket_sco_ctloutput,
.pr_abort = ng_btsocket_sco_abort,
- .pr_accept = ng_btsocket_sco_accept,
+ .pr_accept = ng_btsocket_sco_peeraddr,
.pr_attach = ng_btsocket_sco_attach,
.pr_bind = ng_btsocket_sco_bind,
.pr_connect = ng_btsocket_sco_connect,
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c
--- a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c
@@ -1556,16 +1556,6 @@
return (0);
} /* ng_btsocket_hci_raw_disconnect */
-/*
- * Get socket peer's address
- */
-
-int
-ng_btsocket_hci_raw_peeraddr(struct socket *so, struct sockaddr **nam)
-{
- return (ng_btsocket_hci_raw_sockaddr(so, nam));
-} /* ng_btsocket_hci_raw_peeraddr */
-
/*
* Send data
*/
@@ -1656,25 +1646,24 @@
*/
int
-ng_btsocket_hci_raw_sockaddr(struct socket *so, struct sockaddr **nam)
+ng_btsocket_hci_raw_sockaddr(struct socket *so, struct sockaddr *sa)
{
ng_btsocket_hci_raw_pcb_p pcb = so2hci_raw_pcb(so);
- struct sockaddr_hci sa;
+ struct sockaddr_hci *hci = (struct sockaddr_hci *)sa;
if (pcb == NULL)
return (EINVAL);
if (ng_btsocket_hci_raw_node == NULL)
return (EINVAL);
- bzero(&sa, sizeof(sa));
- sa.hci_len = sizeof(sa);
- sa.hci_family = AF_BLUETOOTH;
+ *hci = (struct sockaddr_hci ){
+ .hci_len = sizeof(struct sockaddr_hci),
+ .hci_family = AF_BLUETOOTH,
+ };
mtx_lock(&pcb->pcb_mtx);
- strlcpy(sa.hci_node, pcb->addr.hci_node, sizeof(sa.hci_node));
+ strlcpy(hci->hci_node, pcb->addr.hci_node, sizeof(hci->hci_node));
mtx_unlock(&pcb->pcb_mtx);
- *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
-
- return ((*nam == NULL)? ENOMEM : 0);
-} /* ng_btsocket_hci_raw_sockaddr */
+ return (0);
+}
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c
--- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c
@@ -2509,68 +2509,43 @@
return (error);
} /* ng_btsocket_listen */
-static int
-ng_btsocket_l2cap_peeraddr1(struct socket *so, struct sockaddr_l2cap *sa)
+/*
+ * Return peer address for getpeername(2) or for accept(2). For the latter
+ * case no extra work to do here, socket must be connected and ready.
+ */
+int
+ng_btsocket_l2cap_peeraddr(struct socket *so, struct sockaddr *sa)
{
ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
+ struct sockaddr_l2cap *l2cap = (struct sockaddr_l2cap *)sa;
if (pcb == NULL)
return (EINVAL);
if (ng_btsocket_l2cap_node == NULL)
return (EINVAL);
- *sa = (struct sockaddr_l2cap ){
+ *l2cap = (struct sockaddr_l2cap ){
.l2cap_len = sizeof(struct sockaddr_l2cap),
.l2cap_family = AF_BLUETOOTH,
.l2cap_psm = htole16(pcb->psm),
};
- bcopy(&pcb->dst, &sa->l2cap_bdaddr, sizeof(sa->l2cap_bdaddr));
+ bcopy(&pcb->dst, &l2cap->l2cap_bdaddr, sizeof(l2cap->l2cap_bdaddr));
switch(pcb->idtype){
case NG_L2CAP_L2CA_IDTYPE_ATT:
- sa->l2cap_cid = NG_L2CAP_ATT_CID;
+ l2cap->l2cap_cid = NG_L2CAP_ATT_CID;
break;
case NG_L2CAP_L2CA_IDTYPE_SMP:
- sa->l2cap_cid = NG_L2CAP_SMP_CID;
+ l2cap->l2cap_cid = NG_L2CAP_SMP_CID;
break;
default:
- sa->l2cap_cid = 0;
+ l2cap->l2cap_cid = 0;
break;
}
- sa->l2cap_bdaddr_type = pcb->dsttype;
+ l2cap->l2cap_bdaddr_type = pcb->dsttype;
return (0);
}
-/*
- * Get peer address
- */
-int
-ng_btsocket_l2cap_peeraddr(struct socket *so, struct sockaddr **nam)
-{
- struct sockaddr_l2cap sa;
- int error;
-
- error = ng_btsocket_l2cap_peeraddr1(so, &sa);
- if (error != 0)
- return (error);
- *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
-
- return ((*nam == NULL)? ENOMEM : 0);
-}
-
-/*
- * Accept connection on socket. Nothing to do here, socket must be connected
- * and ready, so just return peer address and be done with it.
- */
-int
-ng_btsocket_l2cap_accept(struct socket *so, struct sockaddr *sa)
-{
- if (ng_btsocket_l2cap_node == NULL)
- return (EINVAL);
-
- return (ng_btsocket_l2cap_peeraddr1(so, (struct sockaddr_l2cap *)sa));
-}
-
/*
* Send data to socket
*/
@@ -2702,29 +2677,27 @@
/*
* Get socket address
*/
-
int
-ng_btsocket_l2cap_sockaddr(struct socket *so, struct sockaddr **nam)
+ng_btsocket_l2cap_sockaddr(struct socket *so, struct sockaddr *sa)
{
ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
- struct sockaddr_l2cap sa;
+ struct sockaddr_l2cap *l2cap = (struct sockaddr_l2cap *)sa;
if (pcb == NULL)
return (EINVAL);
if (ng_btsocket_l2cap_node == NULL)
return (EINVAL);
- bcopy(&pcb->src, &sa.l2cap_bdaddr, sizeof(sa.l2cap_bdaddr));
- sa.l2cap_psm = htole16(pcb->psm);
- sa.l2cap_len = sizeof(sa);
- sa.l2cap_family = AF_BLUETOOTH;
- sa.l2cap_cid = 0;
- sa.l2cap_bdaddr_type = pcb->srctype;
-
- *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
+ *l2cap = (struct sockaddr_l2cap ){
+ .l2cap_len = sizeof(struct sockaddr_l2cap),
+ .l2cap_family = AF_BLUETOOTH,
+ .l2cap_psm = htole16(pcb->psm),
+ .l2cap_bdaddr_type = pcb->srctype,
+ };
+ bcopy(&pcb->src, &l2cap->l2cap_bdaddr, sizeof(l2cap->l2cap_bdaddr));
- return ((*nam == NULL)? ENOMEM : 0);
-} /* ng_btsocket_l2cap_sockaddr */
+ return (0);
+}
/*****************************************************************************
*****************************************************************************
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c
--- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c
@@ -1204,30 +1204,28 @@
*/
int
-ng_btsocket_l2cap_raw_peeraddr(struct socket *so, struct sockaddr **nam)
+ng_btsocket_l2cap_raw_peeraddr(struct socket *so, struct sockaddr *sa)
{
ng_btsocket_l2cap_raw_pcb_p pcb = so2l2cap_raw_pcb(so);
- struct sockaddr_l2cap sa;
+ struct sockaddr_l2cap *l2cap = (struct sockaddr_l2cap *)sa;
if (pcb == NULL)
return (EINVAL);
if (ng_btsocket_l2cap_raw_node == NULL)
return (EINVAL);
+ *l2cap = (struct sockaddr_l2cap ){
+ .l2cap_len = sizeof(struct sockaddr_l2cap),
+ .l2cap_family = AF_BLUETOOTH,
+ .l2cap_bdaddr_type = BDADDR_BREDR,
+ };
+
mtx_lock(&pcb->pcb_mtx);
- bcopy(&pcb->dst, &sa.l2cap_bdaddr, sizeof(sa.l2cap_bdaddr));
+ bcopy(&pcb->dst, &l2cap->l2cap_bdaddr, sizeof(l2cap->l2cap_bdaddr));
mtx_unlock(&pcb->pcb_mtx);
- sa.l2cap_psm = 0;
- sa.l2cap_len = sizeof(sa);
- sa.l2cap_family = AF_BLUETOOTH;
- sa.l2cap_cid = 0;
- sa.l2cap_bdaddr_type = BDADDR_BREDR;
-
- *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
-
- return ((*nam == NULL)? ENOMEM : 0);
-} /* ng_btsocket_l2cap_raw_peeraddr */
+ return (0);
+}
/*
* Send data to socket
@@ -1248,29 +1246,28 @@
*/
int
-ng_btsocket_l2cap_raw_sockaddr(struct socket *so, struct sockaddr **nam)
+ng_btsocket_l2cap_raw_sockaddr(struct socket *so, struct sockaddr *sa)
{
ng_btsocket_l2cap_raw_pcb_p pcb = so2l2cap_raw_pcb(so);
- struct sockaddr_l2cap sa;
+ struct sockaddr_l2cap *l2cap = (struct sockaddr_l2cap *)sa;
if (pcb == NULL)
return (EINVAL);
if (ng_btsocket_l2cap_raw_node == NULL)
return (EINVAL);
+ *l2cap = (struct sockaddr_l2cap ){
+ .l2cap_len = sizeof(struct sockaddr_l2cap),
+ .l2cap_family = AF_BLUETOOTH,
+ .l2cap_bdaddr_type = BDADDR_BREDR,
+ };
+
mtx_lock(&pcb->pcb_mtx);
- bcopy(&pcb->src, &sa.l2cap_bdaddr, sizeof(sa.l2cap_bdaddr));
+ bcopy(&pcb->src, &l2cap->l2cap_bdaddr, sizeof(l2cap->l2cap_bdaddr));
mtx_unlock(&pcb->pcb_mtx);
- sa.l2cap_psm = 0;
- sa.l2cap_len = sizeof(sa);
- sa.l2cap_family = AF_BLUETOOTH;
- sa.l2cap_cid = 0;
- sa.l2cap_bdaddr_type = BDADDR_BREDR;
- *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
-
- return ((*nam == NULL)? ENOMEM : 0);
-} /* ng_btsocket_l2cap_raw_sockaddr */
+ return (0);
+}
/*
* Get next token
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c
--- a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c
@@ -914,52 +914,29 @@
return (error);
} /* ng_btsocket_listen */
-static int
-ng_btsocket_rfcomm_peeraddr1(struct socket *so, struct sockaddr_rfcomm *sa)
+/*
+ * Return peer address for getpeername(2) or for accept(2). For the latter
+ * case no extra work to do here, socket must be connected and ready.
+ */
+int
+ng_btsocket_rfcomm_peeraddr(struct socket *so, struct sockaddr *sa)
{
ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
+ struct sockaddr_rfcomm *rfcomm = (struct sockaddr_rfcomm *)sa;
if (pcb == NULL)
return (EINVAL);
- *sa = (struct sockaddr_rfcomm ){
+ *rfcomm = (struct sockaddr_rfcomm ){
.rfcomm_len = sizeof(struct sockaddr_rfcomm),
.rfcomm_family = AF_BLUETOOTH,
.rfcomm_channel = pcb->channel,
};
- bcopy(&pcb->dst, &sa->rfcomm_bdaddr, sizeof(sa->rfcomm_bdaddr));
+ bcopy(&pcb->dst, &rfcomm->rfcomm_bdaddr, sizeof(rfcomm->rfcomm_bdaddr));
return (0);
}
-/*
- * Get peer address
- */
-int
-ng_btsocket_rfcomm_peeraddr(struct socket *so, struct sockaddr **nam)
-{
- struct sockaddr_rfcomm sa;
- int error;
-
- error = ng_btsocket_rfcomm_peeraddr1(so, &sa);
- if (error != 0)
- return (error);
- *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
-
- return ((*nam == NULL)? ENOMEM : 0);
-}
-
-/*
- * Accept connection on socket. Nothing to do here, socket must be connected
- * and ready, so just return peer address and be done with it.
- */
-int
-ng_btsocket_rfcomm_accept(struct socket *so, struct sockaddr *sa)
-{
-
- return (ng_btsocket_rfcomm_peeraddr1(so, (struct sockaddr_rfcomm *)sa));
-}
-
/*
* Send data to socket
*/
@@ -1008,23 +985,23 @@
*/
int
-ng_btsocket_rfcomm_sockaddr(struct socket *so, struct sockaddr **nam)
+ng_btsocket_rfcomm_sockaddr(struct socket *so, struct sockaddr *sa)
{
ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
- struct sockaddr_rfcomm sa;
+ struct sockaddr_rfcomm *rfcomm = (struct sockaddr_rfcomm *)sa;
if (pcb == NULL)
return (EINVAL);
- bcopy(&pcb->src, &sa.rfcomm_bdaddr, sizeof(sa.rfcomm_bdaddr));
- sa.rfcomm_channel = pcb->channel;
- sa.rfcomm_len = sizeof(sa);
- sa.rfcomm_family = AF_BLUETOOTH;
-
- *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
+ *rfcomm = (struct sockaddr_rfcomm ){
+ .rfcomm_len = sizeof(struct sockaddr_rfcomm),
+ .rfcomm_family = AF_BLUETOOTH,
+ .rfcomm_channel = pcb->channel,
+ };
+ bcopy(&pcb->src, &rfcomm->rfcomm_bdaddr, sizeof(rfcomm->rfcomm_bdaddr));
- return ((*nam == NULL)? ENOMEM : 0);
-} /* ng_btsocket_rfcomm_sockaddr */
+ return (0);
+}
/*
* Upcall function for L2CAP sockets. Enqueue RFCOMM task.
diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c b/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c
--- a/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c
+++ b/sys/netgraph/bluetooth/socket/ng_btsocket_sco.c
@@ -1609,57 +1609,32 @@
return (error);
} /* ng_btsocket_listen */
-static int
-ng_btsocket_sco_peeraddr1(struct socket *so, struct sockaddr_sco *sa)
+/*
+ * Return peer address for getpeername(2) or for accept(2). For the latter
+ * case no extra work to do here, socket must be connected and ready.
+ */
+int
+ng_btsocket_sco_peeraddr(struct socket *so, struct sockaddr *sa)
{
ng_btsocket_sco_pcb_p pcb = so2sco_pcb(so);
+ struct sockaddr_sco *sco = (struct sockaddr_sco *)sa;
if (pcb == NULL)
return (EINVAL);
if (ng_btsocket_sco_node == NULL)
return (EINVAL);
- *sa = (struct sockaddr_sco ){
+ *sco = (struct sockaddr_sco ){
.sco_len = sizeof(struct sockaddr_sco),
.sco_family = AF_BLUETOOTH,
};
mtx_lock(&pcb->pcb_mtx);
- bcopy(&pcb->dst, &sa->sco_bdaddr, sizeof(sa->sco_bdaddr));
+ bcopy(&pcb->dst, &sco->sco_bdaddr, sizeof(sco->sco_bdaddr));
mtx_unlock(&pcb->pcb_mtx);
return (0);
}
-/*
- * Get peer address
- */
-int
-ng_btsocket_sco_peeraddr(struct socket *so, struct sockaddr **nam)
-{
- struct sockaddr_sco sa;
- int error;
-
- error = ng_btsocket_sco_peeraddr1(so, &sa);
- if (error != 0)
- return (error);
- *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
-
- return ((*nam == NULL)? ENOMEM : 0);
-}
-
-/*
- * Accept connection on socket. Nothing to do here, socket must be connected
- * and ready, so just return peer address and be done with it.
- */
-int
-ng_btsocket_sco_accept(struct socket *so, struct sockaddr *sa)
-{
- if (ng_btsocket_sco_node == NULL)
- return (EINVAL);
-
- return (ng_btsocket_sco_peeraddr1(so, (struct sockaddr_sco *)sa));
-}
-
/*
* Send data to socket
*/
@@ -1791,27 +1766,26 @@
*/
int
-ng_btsocket_sco_sockaddr(struct socket *so, struct sockaddr **nam)
+ng_btsocket_sco_sockaddr(struct socket *so, struct sockaddr *sa)
{
ng_btsocket_sco_pcb_p pcb = so2sco_pcb(so);
- struct sockaddr_sco sa;
+ struct sockaddr_sco *sco = (struct sockaddr_sco *)sa;
if (pcb == NULL)
return (EINVAL);
if (ng_btsocket_sco_node == NULL)
return (EINVAL);
+ *sco = (struct sockaddr_sco ){
+ .sco_len = sizeof(struct sockaddr_sco),
+ .sco_family = AF_BLUETOOTH,
+ };
mtx_lock(&pcb->pcb_mtx);
- bcopy(&pcb->src, &sa.sco_bdaddr, sizeof(sa.sco_bdaddr));
+ bcopy(&pcb->src, &sco->sco_bdaddr, sizeof(sco->sco_bdaddr));
mtx_unlock(&pcb->pcb_mtx);
- sa.sco_len = sizeof(sa);
- sa.sco_family = AF_BLUETOOTH;
-
- *nam = sodupsockaddr((struct sockaddr *) &sa, M_NOWAIT);
-
- return ((*nam == NULL)? ENOMEM : 0);
-} /* ng_btsocket_sco_sockaddr */
+ return (0);
+}
/*****************************************************************************
*****************************************************************************
diff --git a/sys/netgraph/ng_ksocket.c b/sys/netgraph/ng_ksocket.c
--- a/sys/netgraph/ng_ksocket.c
+++ b/sys/netgraph/ng_ksocket.c
@@ -771,9 +771,8 @@
case NGM_KSOCKET_GETNAME:
case NGM_KSOCKET_GETPEERNAME:
{
- int (*func)(struct socket *so, struct sockaddr **nam);
- struct sockaddr *sa = NULL;
- int len;
+ int (*func)(struct socket *so, struct sockaddr *sa);
+ struct sockaddr_storage ss = { .ss_len = sizeof(ss) };
/* Sanity check */
if (msg->header.arglen != 0)
@@ -786,27 +785,22 @@
if ((so->so_state
& (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0)
ERROUT(ENOTCONN);
- func = so->so_proto->pr_peeraddr;
+ func = sopeeraddr;
} else
- func = so->so_proto->pr_sockaddr;
+ func = sosockaddr;
/* Get local or peer address */
- if ((error = (*func)(so, &sa)) != 0)
- goto bail;
- len = (sa == NULL) ? 0 : sa->sa_len;
+ error = (*func)(so, (struct sockaddr *)&ss);
+ if (error)
+ break;
/* Send it back in a response */
- NG_MKRESPONSE(resp, msg, len, M_NOWAIT);
- if (resp == NULL) {
+ NG_MKRESPONSE(resp, msg, ss.ss_len, M_NOWAIT);
+ if (resp != NULL)
+ bcopy(&ss, resp->data, ss.ss_len);
+ else
error = ENOMEM;
- goto bail;
- }
- bcopy(sa, resp->data, len);
- bail:
- /* Cleanup */
- if (sa != NULL)
- free(sa, M_SONAME);
break;
}
diff --git a/sys/netgraph/ng_socket.c b/sys/netgraph/ng_socket.c
--- a/sys/netgraph/ng_socket.c
+++ b/sys/netgraph/ng_socket.c
@@ -500,11 +500,10 @@
* Used for both data and control sockets
*/
static int
-ng_getsockaddr(struct socket *so, struct sockaddr **addr)
+ng_getsockaddr(struct socket *so, struct sockaddr *sa)
{
+ struct sockaddr_ng *sg = (struct sockaddr_ng *)sa;
struct ngpcb *pcbp;
- struct sockaddr_ng *sg;
- int sg_len;
int error = 0;
pcbp = sotongpcb(so);
@@ -512,9 +511,10 @@
/* XXXGL: can this still happen? */
return (EINVAL);
- sg_len = sizeof(struct sockaddr_ng) + NG_NODESIZ -
- sizeof(sg->sg_data);
- sg = malloc(sg_len, M_SONAME, M_WAITOK | M_ZERO);
+ *sg = (struct sockaddr_ng ){
+ .sg_len = sizeof(struct sockaddr_ng),
+ .sg_family = AF_NETGRAPH,
+ };
mtx_lock(&pcbp->sockdata->mtx);
if (pcbp->sockdata->node != NULL) {
@@ -526,16 +526,9 @@
else
snprintf(sg->sg_data, sizeof(sg->sg_data), "[%x]",
ng_node2ID(node));
- mtx_unlock(&pcbp->sockdata->mtx);
-
- sg->sg_len = sg_len;
- sg->sg_family = AF_NETGRAPH;
- *addr = (struct sockaddr *)sg;
- } else {
- mtx_unlock(&pcbp->sockdata->mtx);
- free(sg, M_SONAME);
+ } else
error = EINVAL;
- }
+ mtx_unlock(&pcbp->sockdata->mtx);
return (error);
}
diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h
--- a/sys/netinet/in_pcb.h
+++ b/sys/netinet/in_pcb.h
@@ -721,10 +721,8 @@
struct inpcb *inp_next(struct inpcb_iterator *);
void in_losing(struct inpcb *);
void in_pcbsetsolabel(struct socket *so);
-int in_getpeeraddr(struct socket *so, struct sockaddr **nam);
-int in_getsockaddr(struct socket *so, struct sockaddr **nam);
-struct sockaddr *
- in_sockaddr(in_port_t port, struct in_addr *addr);
+int in_getpeeraddr(struct socket *, struct sockaddr *sa);
+int in_getsockaddr(struct socket *, struct sockaddr *sa);
void in_pcbsosetlabel(struct socket *so);
#ifdef RATELIMIT
int
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -1824,57 +1824,40 @@
/*
* Common routines to return the socket addresses associated with inpcbs.
*/
-struct sockaddr *
-in_sockaddr(in_port_t port, struct in_addr *addr_p)
-{
- struct sockaddr_in *sin;
-
- sin = malloc(sizeof *sin, M_SONAME,
- M_WAITOK | M_ZERO);
- sin->sin_family = AF_INET;
- sin->sin_len = sizeof(*sin);
- sin->sin_addr = *addr_p;
- sin->sin_port = port;
-
- return (struct sockaddr *)sin;
-}
-
int
-in_getsockaddr(struct socket *so, struct sockaddr **nam)
+in_getsockaddr(struct socket *so, struct sockaddr *sa)
{
struct inpcb *inp;
- struct in_addr addr;
- in_port_t port;
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in_getsockaddr: inp == NULL"));
- INP_RLOCK(inp);
- port = inp->inp_lport;
- addr = inp->inp_laddr;
- INP_RUNLOCK(inp);
+ *(struct sockaddr_in *)sa = (struct sockaddr_in ){
+ .sin_len = sizeof(struct sockaddr_in),
+ .sin_family = AF_INET,
+ .sin_port = inp->inp_lport,
+ .sin_addr = inp->inp_laddr,
+ };
- *nam = in_sockaddr(port, &addr);
- return 0;
+ return (0);
}
int
-in_getpeeraddr(struct socket *so, struct sockaddr **nam)
+in_getpeeraddr(struct socket *so, struct sockaddr *sa)
{
struct inpcb *inp;
- struct in_addr addr;
- in_port_t port;
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in_getpeeraddr: inp == NULL"));
- INP_RLOCK(inp);
- port = inp->inp_fport;
- addr = inp->inp_faddr;
- INP_RUNLOCK(inp);
+ *(struct sockaddr_in *)sa = (struct sockaddr_in ){
+ .sin_len = sizeof(struct sockaddr_in),
+ .sin_family = AF_INET,
+ .sin_port = inp->inp_fport,
+ .sin_addr = inp->inp_faddr,
+ };
- *nam = in_sockaddr(port, &addr);
- return 0;
+ return (0);
}
static bool
diff --git a/sys/netinet/sctp_os.h b/sys/netinet/sctp_os.h
--- a/sys/netinet/sctp_os.h
+++ b/sys/netinet/sctp_os.h
@@ -39,9 +39,6 @@
* General kernel memory allocation:
* SCTP_MALLOC(element, type, size, name)
* SCTP_FREE(element)
- * Kernel memory allocation for "soname"- memory must be zeroed.
- * SCTP_MALLOC_SONAME(name, type, size)
- * SCTP_FREE_SONAME(name)
*/
/*
diff --git a/sys/netinet/sctp_os_bsd.h b/sys/netinet/sctp_os_bsd.h
--- a/sys/netinet/sctp_os_bsd.h
+++ b/sys/netinet/sctp_os_bsd.h
@@ -219,13 +219,6 @@
#define SCTP_FREE(var, type) free(var, type)
-#define SCTP_MALLOC_SONAME(var, type, size) \
- do { \
- var = (type)malloc(size, M_SONAME, M_WAITOK | M_ZERO); \
- } while (0)
-
-#define SCTP_FREE_SONAME(var) free(var, M_SONAME)
-
#define SCTP_PROCESS_STRUCT struct proc *
/*
diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c
--- a/sys/netinet/sctp_usrreq.c
+++ b/sys/netinet/sctp_usrreq.c
@@ -7367,24 +7367,20 @@
#ifdef INET
int
-sctp_ingetaddr(struct socket *so, struct sockaddr **addr)
+sctp_ingetaddr(struct socket *so, struct sockaddr *sa)
{
- struct sockaddr_in *sin;
+ struct sockaddr_in *sin = (struct sockaddr_in *)sa;
uint32_t vrf_id;
struct sctp_inpcb *inp;
struct sctp_ifa *sctp_ifa;
- /*
- * Do the malloc first in case it blocks.
- */
- SCTP_MALLOC_SONAME(sin, struct sockaddr_in *, sizeof *sin);
- if (sin == NULL)
- return (ENOMEM);
- sin->sin_family = AF_INET;
- sin->sin_len = sizeof(*sin);
+ *sin = (struct sockaddr_in ){
+ .sin_len = sizeof(struct sockaddr_in),
+ .sin_family = AF_INET,
+ };
+
inp = (struct sctp_inpcb *)so->so_pcb;
if (!inp) {
- SCTP_FREE_SONAME(sin);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
return (ECONNRESET);
}
@@ -7453,39 +7449,35 @@
}
}
if (!fnd) {
- SCTP_FREE_SONAME(sin);
SCTP_INP_RUNLOCK(inp);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOENT);
return (ENOENT);
}
}
SCTP_INP_RUNLOCK(inp);
- (*addr) = (struct sockaddr *)sin;
+
return (0);
}
int
-sctp_peeraddr(struct socket *so, struct sockaddr **addr)
+sctp_peeraddr(struct socket *so, struct sockaddr *sa)
{
- struct sockaddr_in *sin;
+ struct sockaddr_in *sin = (struct sockaddr_in *)sa;
int fnd;
struct sockaddr_in *sin_a;
struct sctp_inpcb *inp;
struct sctp_tcb *stcb;
struct sctp_nets *net;
- /* Do the malloc first in case it blocks. */
- SCTP_MALLOC_SONAME(sin, struct sockaddr_in *, sizeof *sin);
- if (sin == NULL)
- return (ENOMEM);
- sin->sin_family = AF_INET;
- sin->sin_len = sizeof(*sin);
+ *sin = (struct sockaddr_in ){
+ .sin_len = sizeof(struct sockaddr_in),
+ .sin_family = AF_INET,
+ };
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(sin);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOTCONN);
return (ENOTCONN);
}
@@ -7496,7 +7488,6 @@
}
SCTP_INP_RUNLOCK(inp);
if (stcb == NULL) {
- SCTP_FREE_SONAME(sin);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, EINVAL);
return (ECONNRESET);
}
@@ -7513,11 +7504,10 @@
SCTP_TCB_UNLOCK(stcb);
if (!fnd) {
/* No IPv4 address */
- SCTP_FREE_SONAME(sin);
SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTP_USRREQ, ENOENT);
return (ENOENT);
}
- (*addr) = (struct sockaddr *)sin;
+
return (0);
}
diff --git a/sys/netinet/sctp_var.h b/sys/netinet/sctp_var.h
--- a/sys/netinet/sctp_var.h
+++ b/sys/netinet/sctp_var.h
@@ -338,8 +338,8 @@
/* can't use sctp_assoc_t here */
int sctp_peeloff(struct socket *, struct socket *, int, caddr_t, int *);
-int sctp_ingetaddr(struct socket *, struct sockaddr **);
-int sctp_peeraddr(struct socket *, struct sockaddr **);
+int sctp_ingetaddr(struct socket *, struct sockaddr *);
+int sctp_peeraddr(struct socket *, struct sockaddr *);
int sctp_listen(struct socket *, int, struct thread *);
int sctp_accept(struct socket *, struct sockaddr *);
diff --git a/sys/netinet6/in6.h b/sys/netinet6/in6.h
--- a/sys/netinet6/in6.h
+++ b/sys/netinet6/in6.h
@@ -675,7 +675,6 @@
void in6_sin_2_v4mapsin6(struct sockaddr_in *sin,
struct sockaddr_in6 *sin6);
void in6_sin6_2_sin_in_sock(struct sockaddr *nam);
-void in6_sin_2_v4mapsin6_in_sock(struct sockaddr **nam);
extern void addrsel_policy_init(void);
#define satosin6(sa) ((struct sockaddr_in6 *)(sa))
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -2679,20 +2679,6 @@
in6_sin6_2_sin(sin_p, &sin6);
}
-/* Convert sockaddr_in into sockaddr_in6 in v4 mapped addr format. */
-void
-in6_sin_2_v4mapsin6_in_sock(struct sockaddr **nam)
-{
- struct sockaddr_in *sin_p;
- struct sockaddr_in6 *sin6_p;
-
- sin6_p = malloc(sizeof *sin6_p, M_SONAME, M_WAITOK);
- sin_p = (struct sockaddr_in *)*nam;
- in6_sin_2_v4mapsin6(sin_p, sin6_p);
- free(*nam, M_SONAME);
- *nam = (struct sockaddr *)sin6_p;
-}
-
/*
* Join/leave the solicited multicast groups for proxy NDP entries.
*/
diff --git a/sys/netinet6/in6_pcb.h b/sys/netinet6/in6_pcb.h
--- a/sys/netinet6/in6_pcb.h
+++ b/sys/netinet6/in6_pcb.h
@@ -96,12 +96,10 @@
struct inpcb *(*)(struct inpcb *, int));
struct inpcb *
in6_rtchange(struct inpcb *, int);
-struct sockaddr *
- in6_sockaddr(in_port_t port, struct in6_addr *addr_p);
-int in6_getpeeraddr(struct socket *so, struct sockaddr **nam);
-int in6_getsockaddr(struct socket *so, struct sockaddr **nam);
-int in6_mapped_sockaddr(struct socket *so, struct sockaddr **nam);
-int in6_mapped_peeraddr(struct socket *so, struct sockaddr **nam);
+int in6_getpeeraddr(struct socket *, struct sockaddr *);
+int in6_getsockaddr(struct socket *, struct sockaddr *);
+int in6_mapped_sockaddr(struct socket *, struct sockaddr *);
+int in6_mapped_peeraddr(struct socket *, struct sockaddr *);
int in6_selecthlim(struct inpcb *, struct ifnet *);
int in6_pcbsetport(struct in6_addr *, struct inpcb *, struct ucred *);
void init_sin6(struct sockaddr_in6 *sin6, struct mbuf *m, int);
diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c
--- a/sys/netinet6/in6_pcb.c
+++ b/sys/netinet6/in6_pcb.c
@@ -501,62 +501,48 @@
inp->inp_flow &= ~IPV6_FLOWLABEL_MASK;
}
-struct sockaddr *
-in6_sockaddr(in_port_t port, struct in6_addr *addr_p)
-{
- struct sockaddr_in6 *sin6;
-
- sin6 = malloc(sizeof *sin6, M_SONAME, M_WAITOK);
- bzero(sin6, sizeof *sin6);
- sin6->sin6_family = AF_INET6;
- sin6->sin6_len = sizeof(*sin6);
- sin6->sin6_port = port;
- sin6->sin6_addr = *addr_p;
- (void)sa6_recoverscope(sin6); /* XXX: should catch errors */
-
- return (struct sockaddr *)sin6;
-}
-
int
-in6_getsockaddr(struct socket *so, struct sockaddr **nam)
+in6_getsockaddr(struct socket *so, struct sockaddr *sa)
{
struct inpcb *inp;
- struct in6_addr addr;
- in_port_t port;
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in6_getsockaddr: inp == NULL"));
- INP_RLOCK(inp);
- port = inp->inp_lport;
- addr = inp->in6p_laddr;
- INP_RUNLOCK(inp);
+ *(struct sockaddr_in6 *)sa = (struct sockaddr_in6 ){
+ .sin6_len = sizeof(struct sockaddr_in6),
+ .sin6_family = AF_INET6,
+ .sin6_port = inp->inp_lport,
+ .sin6_addr = inp->in6p_laddr,
+ };
+ /* XXX: should catch errors */
+ (void)sa6_recoverscope((struct sockaddr_in6 *)sa);
- *nam = in6_sockaddr(port, &addr);
- return 0;
+ return (0);
}
int
-in6_getpeeraddr(struct socket *so, struct sockaddr **nam)
+in6_getpeeraddr(struct socket *so, struct sockaddr *sa)
{
struct inpcb *inp;
- struct in6_addr addr;
- in_port_t port;
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in6_getpeeraddr: inp == NULL"));
- INP_RLOCK(inp);
- port = inp->inp_fport;
- addr = inp->in6p_faddr;
- INP_RUNLOCK(inp);
+ *(struct sockaddr_in6 *)sa = (struct sockaddr_in6 ){
+ .sin6_len = sizeof(struct sockaddr_in6),
+ .sin6_family = AF_INET6,
+ .sin6_port = inp->inp_fport,
+ .sin6_addr = inp->in6p_faddr,
+ };
+ /* XXX: should catch errors */
+ (void)sa6_recoverscope((struct sockaddr_in6 *)sa);
- *nam = in6_sockaddr(port, &addr);
- return 0;
+ return (0);
}
int
-in6_mapped_sockaddr(struct socket *so, struct sockaddr **nam)
+in6_mapped_sockaddr(struct socket *so, struct sockaddr *sa)
{
struct inpcb *inp;
int error;
@@ -566,21 +552,23 @@
#ifdef INET
if ((inp->inp_vflag & (INP_IPV4 | INP_IPV6)) == INP_IPV4) {
- error = in_getsockaddr(so, nam);
+ struct sockaddr_in sin;
+
+ error = in_getsockaddr(so, (struct sockaddr *)&sin);
if (error == 0)
- in6_sin_2_v4mapsin6_in_sock(nam);
+ in6_sin_2_v4mapsin6(&sin, (struct sockaddr_in6 *)sa);
} else
#endif
{
/* scope issues will be handled in in6_getsockaddr(). */
- error = in6_getsockaddr(so, nam);
+ error = in6_getsockaddr(so, sa);
}
return error;
}
int
-in6_mapped_peeraddr(struct socket *so, struct sockaddr **nam)
+in6_mapped_peeraddr(struct socket *so, struct sockaddr *sa)
{
struct inpcb *inp;
int error;
@@ -590,13 +578,15 @@
#ifdef INET
if ((inp->inp_vflag & (INP_IPV4 | INP_IPV6)) == INP_IPV4) {
- error = in_getpeeraddr(so, nam);
+ struct sockaddr_in sin;
+
+ error = in_getpeeraddr(so, (struct sockaddr *)&sin);
if (error == 0)
- in6_sin_2_v4mapsin6_in_sock(nam);
+ in6_sin_2_v4mapsin6(&sin, (struct sockaddr_in6 *)sa);
} else
#endif
/* scope issues will be handled in in6_getpeeraddr(). */
- error = in6_getpeeraddr(so, nam);
+ error = in6_getpeeraddr(so, sa);
return error;
}
diff --git a/sys/netinet6/sctp6_usrreq.c b/sys/netinet6/sctp6_usrreq.c
--- a/sys/netinet6/sctp6_usrreq.c
+++ b/sys/netinet6/sctp6_usrreq.c
@@ -880,27 +880,21 @@
}
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 @@
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 @@
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 @@
}
}
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 @@
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 @@
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 @@
}
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 @@
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 @@
}
/* 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 @@
}
/* 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);
diff --git a/sys/netlink/netlink_domain.c b/sys/netlink/netlink_domain.c
--- a/sys/netlink/netlink_domain.c
+++ b/sys/netlink/netlink_domain.c
@@ -540,14 +540,6 @@
return (ENOTCONN);
}
-static int
-nl_pru_peeraddr(struct socket *so, struct sockaddr **sa)
-{
- NL_LOG(LOG_DEBUG3, "socket %p, PID %d", so, curproc->p_pid);
- MPASS(sotonlpcb(so) != NULL);
- return (ENOTCONN);
-}
-
static int
nl_pru_shutdown(struct socket *so)
{
@@ -558,16 +550,16 @@
}
static int
-nl_pru_sockaddr(struct socket *so, struct sockaddr **sa)
+nl_sockaddr(struct socket *so, struct sockaddr *sa)
{
- struct sockaddr_nl *snl;
- snl = malloc(sizeof(struct sockaddr_nl), M_SONAME, M_WAITOK | M_ZERO);
- /* TODO: set other fields */
- snl->nl_len = sizeof(struct sockaddr_nl);
- snl->nl_family = AF_NETLINK;
- snl->nl_pid = sotonlpcb(so)->nl_port;
- *sa = (struct sockaddr *)snl;
+ *(struct sockaddr_nl *)sa = (struct sockaddr_nl ){
+ /* TODO: set other fields */
+ .nl_len = sizeof(struct sockaddr_nl),
+ .nl_family = AF_NETLINK,
+ .nl_pid = sotonlpcb(so)->nl_port,
+ };
+
return (0);
}
@@ -780,11 +772,10 @@
.pr_connect = nl_pru_connect, \
.pr_detach = nl_pru_detach, \
.pr_disconnect = nl_pru_disconnect, \
- .pr_peeraddr = nl_pru_peeraddr, \
.pr_send = nl_pru_send, \
.pr_rcvd = nl_pru_rcvd, \
.pr_shutdown = nl_pru_shutdown, \
- .pr_sockaddr = nl_pru_sockaddr, \
+ .pr_sockaddr = nl_sockaddr, \
.pr_close = nl_pru_close
static struct protosw netlink_raw_sw = {
diff --git a/sys/ofed/drivers/infiniband/ulp/sdp/sdp_main.c b/sys/ofed/drivers/infiniband/ulp/sdp/sdp_main.c
--- a/sys/ofed/drivers/infiniband/ulp/sdp/sdp_main.c
+++ b/sys/ofed/drivers/infiniband/ulp/sdp/sdp_main.c
@@ -206,37 +206,37 @@
}
static int
-sdp_getsockaddr(struct socket *so, struct sockaddr **nam)
+sdp_getsockaddr(struct socket *so, struct sockaddr *sa)
{
- struct sdp_sock *ssk;
- struct in_addr addr;
- in_port_t port;
+ struct sdp_sock *ssk = sdp_sk(so);
- ssk = sdp_sk(so);
SDP_RLOCK(ssk);
- port = ssk->lport;
- addr.s_addr = ssk->laddr;
+ *(struct sockaddr_in *)sa = (struct sockaddr_in ){
+ .sin_family = AF_INET,
+ .sin_len = sizeof(struct sockaddr_in),
+ .sin_addr.s_addr = ssk->laddr,
+ .sin_port = ssk->lport,
+ };
SDP_RUNLOCK(ssk);
- *nam = sdp_sockaddr(port, &addr);
- return 0;
+ return (0);
}
static int
-sdp_getpeeraddr(struct socket *so, struct sockaddr **nam)
+sdp_getpeeraddr(struct socket *so, struct sockaddr *sa)
{
- struct sdp_sock *ssk;
- struct in_addr addr;
- in_port_t port;
+ struct sdp_sock *ssk = sdp_sk(so);
- ssk = sdp_sk(so);
SDP_RLOCK(ssk);
- port = ssk->fport;
- addr.s_addr = ssk->faddr;
+ *(struct sockaddr_in *)sa = (struct sockaddr_in ){
+ .sin_family = AF_INET,
+ .sin_len = sizeof(struct sockaddr_in),
+ .sin_addr.s_addr = ssk->faddr,
+ .sin_port = ssk->fport,
+ };
SDP_RUNLOCK(ssk);
- *nam = sdp_sockaddr(port, &addr);
- return 0;
+ return (0);
}
#if 0
diff --git a/sys/rpc/rpc_generic.c b/sys/rpc/rpc_generic.c
--- a/sys/rpc/rpc_generic.c
+++ b/sys/rpc/rpc_generic.c
@@ -185,20 +185,17 @@
__rpc_socket2sockinfo(struct socket *so, struct __rpc_sockinfo *sip)
{
int type, proto;
- struct sockaddr *sa;
+ struct sockaddr_storage ss = { .ss_len = sizeof(ss) };
sa_family_t family;
struct sockopt opt;
int error;
- CURVNET_SET(so->so_vnet);
- error = so->so_proto->pr_sockaddr(so, &sa);
- CURVNET_RESTORE();
+ error = sosockaddr(so, (struct sockaddr *)&ss);
if (error)
return 0;
- sip->si_alen = sa->sa_len;
- family = sa->sa_family;
- free(sa, M_SONAME);
+ sip->si_alen = ss.ss_len;
+ family = ss.ss_family;
opt.sopt_dir = SOPT_GET;
opt.sopt_level = SOL_SOCKET;
@@ -698,35 +695,31 @@
int
__rpc_sockisbound(struct socket *so)
{
- struct sockaddr *sa;
+ struct sockaddr_storage ss = { .ss_len = sizeof(ss) };
int error, bound;
- CURVNET_SET(so->so_vnet);
- error = so->so_proto->pr_sockaddr(so, &sa);
- CURVNET_RESTORE();
+ error = sosockaddr(so, (struct sockaddr *)&ss);
if (error)
return (0);
- switch (sa->sa_family) {
+ switch (ss.ss_family) {
case AF_INET:
- bound = (((struct sockaddr_in *) sa)->sin_port != 0);
+ bound = (((struct sockaddr_in *)&ss)->sin_port != 0);
break;
#ifdef INET6
case AF_INET6:
- bound = (((struct sockaddr_in6 *) sa)->sin6_port != 0);
+ bound = (((struct sockaddr_in6 *)&ss)->sin6_port != 0);
break;
#endif
case AF_LOCAL:
/* XXX check this */
- bound = (((struct sockaddr_un *) sa)->sun_path[0] != '\0');
+ bound = (((struct sockaddr_un *)&ss)->sun_path[0] != '\0');
break;
default:
bound = FALSE;
break;
}
- free(sa, M_SONAME);
-
return bound;
}
@@ -779,8 +772,8 @@
int
bindresvport(struct socket *so, struct sockaddr *sa)
{
+ struct sockaddr_storage ss = { .ss_len = sizeof(ss) };
int old, error, af;
- bool_t freesa = FALSE;
struct sockaddr_in *sin;
#ifdef INET6
struct sockaddr_in6 *sin6;
@@ -791,12 +784,10 @@
socklen_t salen;
if (sa == NULL) {
- CURVNET_SET(so->so_vnet);
- error = so->so_proto->pr_sockaddr(so, &sa);
- CURVNET_RESTORE();
+ sa = (struct sockaddr *)&ss;
+ error = sosockaddr(so, sa);
if (error)
return (error);
- freesa = TRUE;
af = sa->sa_family;
salen = sa->sa_len;
memset(sa, 0, sa->sa_len);
@@ -837,15 +828,14 @@
opt.sopt_val = &old;
opt.sopt_valsize = sizeof(old);
error = sogetopt(so, &opt);
- if (error) {
- goto out;
- }
+ if (error)
+ return (error);
opt.sopt_dir = SOPT_SET;
opt.sopt_val = &portlow;
error = sosetopt(so, &opt);
if (error)
- goto out;
+ return (error);
}
error = sobind(so, sa, curthread);
@@ -857,9 +847,6 @@
sosetopt(so, &opt);
}
}
-out:
- if (freesa)
- free(sa, M_SONAME);
return (error);
}
diff --git a/sys/rpc/svc_dg.c b/sys/rpc/svc_dg.c
--- a/sys/rpc/svc_dg.c
+++ b/sys/rpc/svc_dg.c
@@ -97,7 +97,6 @@
{
SVCXPRT *xprt;
struct __rpc_sockinfo si;
- struct sockaddr* sa;
int error;
if (jailed(curthread->td_ucred))
@@ -124,15 +123,11 @@
xprt->xp_p2 = NULL;
xprt->xp_ops = &svc_dg_ops;
- CURVNET_SET(so->so_vnet);
- error = so->so_proto->pr_sockaddr(so, &sa);
- CURVNET_RESTORE();
+ xprt->xp_ltaddr.ss_len = sizeof(xprt->xp_ltaddr);
+ error = sosockaddr(so, (struct sockaddr *)&xprt->xp_ltaddr);
if (error)
goto freedata;
- memcpy(&xprt->xp_ltaddr, sa, sa->sa_len);
- free(sa, M_SONAME);
-
xprt_register(xprt);
SOCKBUF_LOCK(&so->so_rcv);
diff --git a/sys/rpc/svc_vc.c b/sys/rpc/svc_vc.c
--- a/sys/rpc/svc_vc.c
+++ b/sys/rpc/svc_vc.c
@@ -206,19 +206,17 @@
size_t recvsize)
{
SVCXPRT *xprt;
- struct sockaddr* sa;
int error;
SOCK_LOCK(so);
if (so->so_state & (SS_ISCONNECTED|SS_ISDISCONNECTED)) {
+ struct sockaddr_storage ss = { .ss_len = sizeof(ss) };
+
SOCK_UNLOCK(so);
- CURVNET_SET(so->so_vnet);
- error = so->so_proto->pr_peeraddr(so, &sa);
- CURVNET_RESTORE();
+ error = sopeeraddr(so, (struct sockaddr *)&ss);
if (error)
return (NULL);
- xprt = svc_vc_create_conn(pool, so, sa);
- free(sa, M_SONAME);
+ xprt = svc_vc_create_conn(pool, so, (struct sockaddr *)&ss);
return (xprt);
}
SOCK_UNLOCK(so);
@@ -231,16 +229,12 @@
xprt->xp_p2 = NULL;
xprt->xp_ops = &svc_vc_rendezvous_ops;
- CURVNET_SET(so->so_vnet);
- error = so->so_proto->pr_sockaddr(so, &sa);
- CURVNET_RESTORE();
+ xprt->xp_ltaddr.ss_len = sizeof(xprt->xp_ltaddr);
+ error = sosockaddr(so, (struct sockaddr *)&xprt->xp_ltaddr);
if (error) {
goto cleanup_svc_vc_create;
}
- memcpy(&xprt->xp_ltaddr, sa, sa->sa_len);
- free(sa, M_SONAME);
-
xprt_register(xprt);
solisten(so, -1, curthread);
@@ -267,7 +261,6 @@
{
SVCXPRT *xprt;
struct cf_conn *cd;
- struct sockaddr* sa = NULL;
struct sockopt opt;
int one = 1;
int error;
@@ -315,15 +308,11 @@
memcpy(&xprt->xp_rtaddr, raddr, raddr->sa_len);
- CURVNET_SET(so->so_vnet);
- error = so->so_proto->pr_sockaddr(so, &sa);
- CURVNET_RESTORE();
+ xprt->xp_ltaddr.ss_len = sizeof(xprt->xp_ltaddr);
+ error = sosockaddr(so, (struct sockaddr *)&xprt->xp_ltaddr);
if (error)
goto cleanup_svc_vc_create;
- memcpy(&xprt->xp_ltaddr, sa, sa->sa_len);
- free(sa, M_SONAME);
-
xprt_register(xprt);
SOCKBUF_LOCK(&so->so_rcv);
diff --git a/sys/sys/protosw.h b/sys/sys/protosw.h
--- a/sys/sys/protosw.h
+++ b/sys/sys/protosw.h
@@ -72,7 +72,7 @@
typedef void pr_detach_t(struct socket *);
typedef int pr_disconnect_t(struct socket *);
typedef int pr_listen_t(struct socket *, int, struct thread *);
-typedef int pr_peeraddr_t(struct socket *, struct sockaddr **);
+typedef int pr_peeraddr_t(struct socket *, struct sockaddr *);
typedef int pr_rcvd_t(struct socket *, int);
typedef int pr_rcvoob_t(struct socket *, struct mbuf *, int);
typedef enum {
@@ -88,7 +88,7 @@
typedef int pr_sense_t(struct socket *, struct stat *);
typedef int pr_shutdown_t(struct socket *);
typedef int pr_flush_t(struct socket *, int);
-typedef int pr_sockaddr_t(struct socket *, struct sockaddr **);
+typedef int pr_sockaddr_t(struct socket *, struct sockaddr *);
typedef int pr_sosend_t(struct socket *, struct sockaddr *, struct uio *,
struct mbuf *, struct mbuf *, int, struct thread *);
typedef int pr_soreceive_t(struct socket *, struct sockaddr **,
diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h
--- a/sys/sys/socketvar.h
+++ b/sys/sys/socketvar.h
@@ -450,6 +450,8 @@
struct file **fpp);
void soabort(struct socket *so);
int soaccept(struct socket *so, struct sockaddr *sa);
+int sopeeraddr(struct socket *so, struct sockaddr *sa);
+int sosockaddr(struct socket *so, struct sockaddr *sa);
void soaio_enqueue(struct task *task);
void soaio_rcv(void *context, int pending);
void soaio_snd(void *context, int pending);
diff --git a/sys/sys/syscallsubr.h b/sys/sys/syscallsubr.h
--- a/sys/sys/syscallsubr.h
+++ b/sys/sys/syscallsubr.h
@@ -187,13 +187,11 @@
size_t *countp, enum uio_seg bufseg, int mode);
int kern_getitimer(struct thread *, u_int, struct itimerval *);
int kern_getppid(struct thread *);
-int kern_getpeername(struct thread *td, int fd, struct sockaddr **sa,
- socklen_t *alen);
+int kern_getpeername(struct thread *td, int fd, struct sockaddr *sa);
int kern_getpriority(struct thread *td, int which, int who);
int kern_getrusage(struct thread *td, int who, struct rusage *rup);
int kern_getsid(struct thread *td, pid_t pid);
-int kern_getsockname(struct thread *td, int fd, struct sockaddr **sa,
- socklen_t *alen);
+int kern_getsockname(struct thread *td, int fd, struct sockaddr *sa);
int kern_getsockopt(struct thread *td, int s, int level, int name,
void *optval, enum uio_seg valseg, socklen_t *valsize);
int kern_ioctl(struct thread *td, int fd, u_long com, caddr_t data);

File Metadata

Mime Type
text/plain
Expires
Fri, Apr 25, 10:51 PM (18 h, 36 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17793934
Default Alt Text
D42694.diff (68 KB)

Event Timeline