git: 479e29157259 - main - linux: make linux_to_bsd_sockaddr() use memory supplied by caller

From: Gleb Smirnoff <glebius_at_FreeBSD.org>
Date: Wed, 15 Oct 2025 18:55:34 UTC
The branch main has been updated by glebius:

URL: https://cgit.FreeBSD.org/src/commit/?id=479e29157259086c40eb61b1326299c22de5a59c

commit 479e29157259086c40eb61b1326299c22de5a59c
Author:     Gleb Smirnoff <glebius@FreeBSD.org>
AuthorDate: 2025-10-15 18:55:06 +0000
Commit:     Gleb Smirnoff <glebius@FreeBSD.org>
CommitDate: 2025-10-15 18:55:06 +0000

    linux: make linux_to_bsd_sockaddr() use memory supplied by caller
    
    No functional change.
    
    Differential Revision:  https://reviews.freebsd.org/D52936
---
 sys/compat/linux/linux.c        | 26 ++++++++++++++++++--------
 sys/compat/linux/linux_common.h |  2 +-
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/sys/compat/linux/linux.c b/sys/compat/linux/linux.c
index 61b207070963..a40f110634f7 100644
--- a/sys/compat/linux/linux.c
+++ b/sys/compat/linux/linux.c
@@ -578,8 +578,13 @@ bsd_to_linux_sockaddr(const struct sockaddr *sa, struct l_sockaddr **lsa,
 	return (0);
 }
 
+/*
+ * If sap is NULL, then osa points at already copied in linux sockaddr that
+ * should be edited in place.  Otherwise memory is allocated, sockaddr
+ * copied in and returned in *sap.
+ */
 int
-linux_to_bsd_sockaddr(const struct l_sockaddr *osa, struct sockaddr **sap,
+linux_to_bsd_sockaddr(struct l_sockaddr *osa, struct sockaddr **sap,
     socklen_t *len)
 {
 	struct sockaddr *sa;
@@ -609,10 +614,12 @@ linux_to_bsd_sockaddr(const struct l_sockaddr *osa, struct sockaddr **sap,
 	}
 #endif
 
-	kosa = malloc(salen, M_SONAME, M_WAITOK);
-
-	if ((error = copyin(osa, kosa, *len)))
-		goto out;
+	if (sap != NULL) {
+		kosa = malloc(salen, M_SONAME, M_WAITOK);
+		if ((error = copyin(osa, kosa, *len)))
+			goto out;
+	} else
+		kosa = osa;
 
 	bdom = linux_to_bsd_domain(kosa->sa_family);
 	if (bdom == AF_UNKNOWN) {
@@ -686,12 +693,15 @@ linux_to_bsd_sockaddr(const struct l_sockaddr *osa, struct sockaddr **sap,
 	sa->sa_family = bdom;
 	sa->sa_len = salen;
 
-	*sap = sa;
-	*len = salen;
+	if (sap != NULL) {
+		*sap = sa;
+		*len = salen;
+	}
 	return (0);
 
 out:
-	free(kosa, M_SONAME);
+	if (sap != NULL)
+		free(kosa, M_SONAME);
 	return (error);
 }
 
diff --git a/sys/compat/linux/linux_common.h b/sys/compat/linux/linux_common.h
index 97f5a259f300..814c183b338a 100644
--- a/sys/compat/linux/linux_common.h
+++ b/sys/compat/linux/linux_common.h
@@ -43,7 +43,7 @@ sa_family_t	bsd_to_linux_domain(sa_family_t domain);
 #define	AF_UNKNOWN	UINT8_MAX
 int		bsd_to_linux_sockaddr(const struct sockaddr *sa,
 		    struct l_sockaddr **lsa, socklen_t len);
-int		linux_to_bsd_sockaddr(const struct l_sockaddr *lsa,
+int		linux_to_bsd_sockaddr(struct l_sockaddr *lsa,
 		    struct sockaddr **sap, socklen_t *len);
 void		linux_to_bsd_poll_events(struct thread *td, int fd,
 		    short lev, short *bev);