aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/hyperv
diff options
context:
space:
mode:
authorGleb Smirnoff <glebius@FreeBSD.org>2023-11-30 16:30:55 +0000
committerGleb Smirnoff <glebius@FreeBSD.org>2023-11-30 16:31:10 +0000
commit0fac350c54d0a72f5341e15021efcde63eb58a4b (patch)
tree6b4229e6fe419e850c04226390fbe5396569aba6 /sys/dev/hyperv
parentcfb1e92912b4cf75360b7fbe86197cc29bc212c1 (diff)
downloadsrc-0fac350c54d0a72f5341e15021efcde63eb58a4b.tar.gz
src-0fac350c54d0a72f5341e15021efcde63eb58a4b.zip
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.c12
-rw-r--r--sys/dev/hyperv/hvsock/hv_sock.h4
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 *,