The branch main has been updated by glebius:

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

commit 479e29157259086c40eb61b1326299c22de5a59c
Author:     Gleb Smirnoff <[email protected]>
AuthorDate: 2025-10-15 18:55:06 +0000
Commit:     Gleb Smirnoff <[email protected]>
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);

Reply via email to