diff options
author | Gleb Smirnoff <glebius@FreeBSD.org> | 2023-11-30 16:30:55 +0000 |
---|---|---|
committer | Gleb Smirnoff <glebius@FreeBSD.org> | 2023-11-30 16:31:10 +0000 |
commit | 0fac350c54d0a72f5341e15021efcde63eb58a4b (patch) | |
tree | 6b4229e6fe419e850c04226390fbe5396569aba6 /sys/dev/hyperv | |
parent | cfb1e92912b4cf75360b7fbe86197cc29bc212c1 (diff) |
sockets: don't malloc/free sockaddr memory on getpeername/getsockname
Just like it was done for accept(2) in cfb1e92912b4, use same approach
for two simplier syscalls that return socket addresses. Although,
these two syscalls aren't performance critical, this change generalizes
some code between 3 syscalls trimming code size.
Following example of accept(2), provide VNET-aware and INVARIANT-checking
wrappers sopeeraddr() and sosockaddr() around protosw methods.
Reviewed by: tuexen
Differential Revision: https://reviews.freebsd.org/D42694
Diffstat (limited to 'sys/dev/hyperv')
-rw-r--r-- | sys/dev/hyperv/hvsock/hv_sock.c | 12 | ||||
-rw-r--r-- | sys/dev/hyperv/hvsock/hv_sock.h | 4 |
2 files changed, 8 insertions, 8 deletions
diff --git a/sys/dev/hyperv/hvsock/hv_sock.c b/sys/dev/hyperv/hvsock/hv_sock.c index 655cc990876e..78ec520f1bb3 100644 --- a/sys/dev/hyperv/hvsock/hv_sock.c +++ b/sys/dev/hyperv/hvsock/hv_sock.c @@ -876,7 +876,7 @@ out: } 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 @@ hvs_trans_peeraddr(struct socket *so, struct sockaddr **nam) 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 @@ hvs_trans_sockaddr(struct socket *so, struct sockaddr **nam) 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/hyperv/hvsock/hv_sock.h b/sys/dev/hyperv/hvsock/hv_sock.h index ee6416a29662..e11621d76dbc 100644 --- a/sys/dev/hyperv/hvsock/hv_sock.h +++ b/sys/dev/hyperv/hvsock/hv_sock.h @@ -103,8 +103,8 @@ int hvs_trans_listen(struct socket *, int, struct thread *); 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 *, |