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);